这是How to wait for a page reload in Laravel integration testing
的后续行动我正在做的是编辑用户的个人资料,然后重新显示该视图。
我的个人资料操作:(UserController)
public function profile(){
return view('user/profile');
}
该视图包含类似
的代码{{ Auth::user()->firstname }}
现在在测试期间,显示旧的(未更改的)用户数据。
测试:
protected function editUserProfile()
{
$this->visit('/user/profile');
$firstName = $this->faker->firstname;
$lastname = $this->faker->lastname;
$this->within('#userEditForm', function() use ($firstName, $lastname) {
$this->type($firstName, 'firstname');
$this->type($lastname, 'surname');
$this->press('Save')
->seePageIs('/user/profile')
->see($firstName) # here the test fails
->see($lastname);
});
}
当我像这样更改UserController时:
public function profile(){
Auth::setUser(Auth::user()->fresh());
return view('user/profile');
}
一切正常。
现在我想明白,为什么会这样。
在这种情况下,为什么集成测试的行为与浏览器的行为不同?是否有更好的方法来协调该行为,以便测试只有在出现“真正的问题”时才会失败?或者我的代码是不是很糟糕?
答案 0 :(得分:1)
您可能正在使用update (int $uid)
来处理请求吗?
最可能的解释是Laravel在测试期间仅使用单个应用程序实例。它将获取您提供的输入,构建请求对象,然后将其发送到控制器方法。从这里它可以渲染视图并检查它是否包含您的文本。
在身份验证实施中,一旦您致电Auth::user()
,它就会执行以下两项操作之一:
您的更新方法(我猜)是从存储中检索用户的新实例并更新它,而不是缓存的。
例如:
\Auth::loginUsingId(1234);
\Auth::user()->email; // 'user@example.com'
$user = \App\User::find(1234);
$user->email; // 'user@example.com';
$user->update(['email' => 'user2@example.com']);
$user->email; // 'user2@example.com'
\Auth::user()->email; // 'user@example.com'