Laravel测试通过了auth中间件,但未通过数据提供程序的auth::user()
我正在使用集成PHPUnit配置测试我的Laravel应用程序,在测试中对用户进行身份验证时遇到问题 我有这个测试(缩短) 使用此数据提供程序:Laravel测试通过了auth中间件,但未通过数据提供程序的auth::user(),laravel,unit-testing,laravel-authentication,phpunit,Laravel,Unit Testing,Laravel Authentication,Phpunit,我正在使用集成PHPUnit配置测试我的Laravel应用程序,在测试中对用户进行身份验证时遇到问题 我有这个测试(缩短) 使用此数据提供程序: public function showEditFormProvider() { return [ 'allowedUser' => [ UserGenerator::getControllingUser(), 200, null,
public function showEditFormProvider() {
return [
'allowedUser' => [
UserGenerator::getControllingUser(),
200,
null,
["something"],
[]
]
];
}
UserGenerator::getControllingUser()
只是触发用户工厂,添加一些权限并返回用户对象
试验方法(也缩短):
此方法的路由封装在routes/web.php中的“middleware”=>“auth”
部分中
问题:
数据提供程序被正确调用,它通过中间件,但是edit()
方法中的Auth::user()
调用返回null-因此,无论通过中间件,身份验证似乎还是失败了
- 如果我直接替换testShowEditForm中的参数$user 对于UserGenerator::getControllingUser(),它可以工作(但这不是一个 很好的解决方法,因为我有很多测试用例,所以我需要 数据提供者)李>
- 所以我打电话给数据提供商 $this->showEditFormProvider()位于测试方法的第一行 testShowEditForm()-但它会被调用两次(正确的方法是什么 根据本条1)的行为。但这也不是问题所在 理想的解决方法,因为如果我在提供程序中创建一个对象 测试时,它也会被创建两次,因此断言会失败
actingAs()
/be()
方法似乎是模拟登录用户的最佳实践
1“所有数据提供程序在调用setUpBeforeClass静态方法和第一次调用setUp方法之前执行。”在Laravel 5.8中,它使用
$user = User::find(Auth::id());
而不是
$user = User::find(Auth::user()->id); // Auth::user() returns null
在控制器内部。
我不知道为什么,但它可能会帮助一些搜索开发人员在未来。
有趣的是,自从Laravel6(目前我的应用程序在6.10.0上)之后,就再也没有问题了,即使是“旧”的实现也是如此。Auth::shouldReceive('user')->andReturn($user);这是一种模拟,但我通常在单元测试中使用它,而不是在功能测试中。你也可以试一试。
$user = User::find(Auth::id());
$user = User::find(Auth::user()->id); // Auth::user() returns null