功能测试代理会影响所有警卫吗?

我的应用程序中有两个不同的用户对象,一个App\User和一个App\Admin。对于两者,我有不同的身份验证保护。


我的默认守卫是web模型守卫App\User,我也有admin模型守卫App\Admin。


例如,这段代码


  $admin = factory(\App\Admin::class)->make();

  \Auth::guard('admin')->login($admin);


  dd([\Auth::check(), \Auth::guard('admin')->check()]);

返回


[假,真]


正如预期的那样。


但是,在我的功能测试中,我正在这样做:


$admin = factory(\App\Admin::class)->make();

$response = $this->actingAs($admin, 'admin')

                 ->get('/admin');

dd([\Auth::check(), \Auth::guard('admin')->check()]);

由于某种原因返回


[真实,真实]


这会导致各种错误(例如,我有一个普通用户的日志中间件,并试图将管理员存储为普通用户抛出 foreign_key 异常等)。


为什么同时actingAs启用两个守卫?这是 Laravel 5.6 中的错误还是我做错了什么?


婷婷同学_
浏览 119回答 1
1回答

红颜莎娜

当您调用actingAs方法时,Laravel 将默认保护更改为admin内部(在这种情况下)。请使用下面的代码$defaultGuard = config('auth.defaults.guard');$admin = factory(\App\Admin::class)->make();$this->actingAs($admin, 'admin');\Auth::shouldUse($defaultGuard);$response = $this->get('/admin');dd([\Auth::check(), \Auth::guard('admin')->check()]);您也可以actingAsAdmin在TestCase类中提取一个方法,以便您可以重用该函数。public function actingAsAdmin($admin) {    $defaultGuard = config('auth.defaults.guard');    $this->actingAs($admin, 'admin');    \Auth::shouldUse($defaultGuard);    return $this;}并像下面这样调用这个函数。$admin = factory(\App\Admin::class)->make();$response = $this->actingAsAdmin($admin)->get('/admin');dd([\Auth::check(), \Auth::guard('admin')->check()]);
打开App,查看更多内容
随时随地看视频慕课网APP