如何正确模拟 Laravel 中的 Illuminate\Http\Request 类

sua*_*ger 5 php unit-testing mocking laravel mockery

我正在尝试测试一个类中的方法,该类包含使用 Laravel 中的 request() 帮助器的方法。这是方法:

类别类

public function getCanonicalUrl()
{
    return preg_match('/\/sale\/./', request()->getRequestUri())
         ? ''
         : url($this->getUrlKey());
}
Run Code Online (Sandbox Code Playgroud)

测试应该使这个帮助器在执行getRequestUri()时正确捕获 URI ,但它实际上返回一个空字符串。这是我进行的数千次测试之一。

测试

public function testCanonical()
{
    // ...

    $requestMock = Mockery::mock(Request::class)
      ->shouldReceive('getRequestUri')
      ->andReturn('/sale/random-string');

    $this->app->instance(Request::class, $requestMock);

    // ...
}
Run Code Online (Sandbox Code Playgroud)

关于如何实现这一目标有什么想法吗?提前致谢。

Ale*_*nin 3

你不应该嘲笑Request门面。相反,在运行测试时将所需的输入传递到 HTTP 帮助器方法,例如 get 和 post。

https://laravel.com/docs/5.5/mocking#mocking-facades