为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
婷婷同学_ 2022-01-08 14:46:20
我的应用程序中有两个不同的用户对象,一个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 中的错误还是我做错了什么?
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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


查看完整回答
反对 回复 2022-01-08
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信