我有一个相当简单的浏览器测试(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'));
}
答案 0 :(得分:0)
通常,我会简单地删除此问题,因为它原来是某种初学者的错误。但是当有人“出演”这个问题时,我宁愿回答。
我无法确切说明问题的出处,但我清除了所有可以清除的内容(缓存),现在测试变为绿色。
答案 1 :(得分:0)
我认为此问题与Dusk登录自身的方式有关。我注意到,尽管调用了$browser->loginAs($user)
,但尝试访问当前用户时,我的观察者总是会得到null。我的解决方案是也调用\Auth::login($user)
来解决问题。
重要的是要记住,运行黄昏测试的PHP流程与应用程序代码是完全隔离的,这可能导致很多混乱。
长期的解决方案可能是放弃Dusk并直接使用WebDriver,因为Dusk的零配置特性使开发人员在出现问题时非常困惑,而对于Laravel Dusk这样的易碎品尤其如此。