功能测试对所有守卫都有作用吗?

问题描述 投票:0回答:2

我的应用程序中有两个不同的用户对象,一个

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 中的错误还是我做错了什么?

php laravel-5 phpunit
2个回答
9
投票

当您调用

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()]);

0
投票

我在我的设置方法中调用了

actingAs()
,但需要使用不同的防护来进行我的一项测试。我在测试中需要做的就是:

Auth::logout();
$this->actingAs($admin, "admin");

关键是在函数调用中指定守卫,否则无法工作。

© www.soinside.com 2019 - 2024. All rights reserved.