Laravel的注入请求对象与`request()`接收的对象不同

时间:2019-06-17 20:32:44

标签: laravel testing phpunit

背景:我正在编写功能测试以测试HMAC身份验证实现。在测试中,我设置了标头Authorization: Bearer {token}并发送了一个简单的GET请求,如下所示:

$headers = ['Authorization' => 'Bearer '.$token];
$response = $this->get($uri, $headers);

在我实际的Auth Guard中,我将请求对象注入到构造函数中并检索标头:

class HMACGuard implements Guard
{
    public function __construct(
        UserProvider $provider,
        Request $request
    ) {
        $this->request = $request;
        $this->provider = $provider;
    }

    public function user()
    {
        // ...
        $token = $this->request->bearerToken();
        // ...
    }
}

这适用于常规请求(通过浏览器或 Postman 等发出)。但是,这不适用于单元测试。但是,这确实可行:

    public function user()
    {
        // ...
        $token = request()->bearerToken();
        // ...
    }

为什么注入的版本有所不同,并且不包含标题信息,而标题信息却是从容器中刚检索到的标题信息呢?返回的对象显然具有不同的ID。如何确保注入正确的Request实例,其中包含任何一种请求类型的所有信息?有没有一种方法可以确保在不使用request()Request之类的全局帮助程序/外观的情况下访问正确的Request对象?

0 个答案:

没有答案