Php Laravel表单请求-$this->;user()与auth()的比较->;授权中的用户()

Php Laravel表单请求-$this->;user()与auth()的比较->;授权中的用户(),php,laravel,unit-testing,Php,Laravel,Unit Testing,有人能解释一下,我们为什么不应该在from请求authorize方法中通过Auth::user()或Auth()->user()助手与文档中建议的$this->user()方法来获取经过身份验证的用户 在我的例子中,我尝试对表单请求进行单元测试,并且auth()->user()允许我检索用户,而$this->user()不允许,因为我没有发出完整的请求。我只是为我的测试创建表单请求对象 public function setUp(): void { parent::setUp();

有人能解释一下,我们为什么不应该在from请求
authorize
方法中通过
Auth::user()
Auth()->user()
助手与文档中建议的
$this->user()
方法来获取经过身份验证的用户

在我的例子中,我尝试对表单请求进行单元测试,并且
auth()->user()
允许我检索用户,而
$this->user()
不允许,因为我没有发出完整的请求。我只是为我的测试创建表单请求对象

public function setUp(): void
{
    parent::setUp();

    $this->subject = new \App\Http\Requests\OrderStoreRequest();
}

// Acting as has no effect when manually creating the orderStoreRequest object
public function testAuthorize()
{
    $this
        ->actingAs(\factory(User::class)->create())
        ->assertTrue($this->subject->authorize());
}
ActingAs()。由于您只是在没有此生命周期的情况下调用您的请求,因此您将永远无法在请求中注入任何内容

要使代码正常工作,需要设置UserResolver。可以这样做

$this->subject->setUserResolver(function () use($user) {
   return $user;
});

为了便于使用,我强烈建议进行Laravel特性测试,而不是单元测试。你将要通过很多方法奋力拼搏,没有Laravel生命周期是不可能被调用的。你会在应用程序上看到doing call()和json()。

我绝对建议不要做那个测试,你是在测试框架,而不是你的代码。。。您要测试的是命中一个端点,然后断言一切正常,例如,您的端点创建了一个您自己的新模型,测试它是否被创建。如果要测试用户在未经授权或甚至未登录时是否被拒绝,请点击端点并使用
$response->assertbanbidded()
$response->assertUnauthorized()
断言响应。。。