功能测试扮演所有警卫的角色?

时间:2019-09-12 05:28:00

标签: php laravel-5 phpunit

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

我的默认防护是模型web的{​​{1}}防护,而我也有模型App\User的{​​{1}}防护。

例如,此代码

admin

返回

  

[false,true]

符合预期。

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

App\Admin

由于某种原因返回

  

[true,true]

这会导致所有类型的错误(例如,我有一个面向普通用户的日志中间件,并试图以普通用户身份存储admin时会抛出Foreign_key异常等)。

$admin = factory(\App\Admin::class)->make(); \Auth::guard('admin')->login($admin); dd([\Auth::check(), \Auth::guard('admin')->check()]); 为什么要同时启用两个防护?是Laravel 5.6中的错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:3)

当您调用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()]);