Laravel测试通过了auth中间件,但未通过数据提供程序的auth::user()

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,

我正在使用集成PHPUnit配置测试我的Laravel应用程序,在测试中对用户进行身份验证时遇到问题

我有这个测试(缩短)

使用此数据提供程序:

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