功能测试作为影响所有守卫?

Ada*_*dam 3 php phpunit laravel-5

我的应用程序中有两个不同的用户对象,一个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()]);
Run Code Online (Sandbox Code Playgroud)

返回

[假,真]

正如预期的那样。

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

$admin = factory(\App\Admin::class)->make();
$response = $this->actingAs($admin, 'admin')
                 ->get('/admin');
dd([\Auth::check(), \Auth::guard('admin')->check()]);
Run Code Online (Sandbox Code Playgroud)

这出于某种原因返回

[真实,真实]

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

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

Pri*_*aju 5

当您调用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()]);
Run Code Online (Sandbox Code Playgroud)

您也可以actingAsAdminTestCase类中提取一个方法,以便您可以重用该函数。

public function actingAsAdmin($admin) {
    $defaultGuard = config('auth.defaults.guard');
    $this->actingAs($admin, 'admin');
    \Auth::shouldUse($defaultGuard);

    return $this;
}
Run Code Online (Sandbox Code Playgroud)

并像下面这样调用这个函数。

$admin = factory(\App\Admin::class)->make();
$response = $this->actingAsAdmin($admin)->get('/admin');
dd([\Auth::check(), \Auth::guard('admin')->check()]);
Run Code Online (Sandbox Code Playgroud)