我有一个相当简单的浏览器测试(laravel-黄昏(。测试失败,不是因为实际断言,而是因为缺少权限。
我登录的用户(loginAs
(具有这些权限。事实证明,最终,尽管我以testUser的身份登录,但实际经过身份验证的用户是另一个用户。
看来经过验证的用户在loginAs()
和访问控制器功能之间切换。但在我看来,这两个步骤应该是一个接一个的。
我尽力解释情况,如果有什么不清楚的地方,请要求澄清。
测试
/**
* @throws Throwable
*/
public function test_something()
{
$this->browse(function (Browser $browser) {
$browser->loginAs($this->testUser) //made a breakpoint here and it showed the correct user
->visit(new IndexPage())
//some asserts
});
}
对应控制器
public function index()
{
dd(Auth::user()->username); //shows not the name of testUser
if (! Auth::user()->can('index'))
return abort(403, "Operation not permitted"); //fails because of wrong user
//gather data
return view('index', compact('data'));
}
通常我会简单地删除这个问题,因为它被证明是初学者的错误。但作为一个"主演"这个问题的人,我宁愿回答它。
我不能确切地说出问题来自哪里,但我清除了我能清除的所有内容(缓存(,现在测试变为绿色。
我认为这个问题与Dusk的登录方式有关。我注意到,尽管调用了$browser->loginAs($user)
,但我的观察者在尝试访问当前用户时总是会为null。我的解决方案是也调用Auth::login($user)
来解决问题。
重要的是要记住,运行黄昏测试的PHP进程与应用程序代码完全隔离,这可能会导致很多混乱。
长期的解决方案可能是放弃Dusk,直接使用WebDriver,因为Dusk的零配置特性让开发人员在出现问题时非常困惑,而像Laravel Dusk这样的古怪产品尤其糟糕。