如何正确模拟 Illuminate\Http\Request class 来自 Laravel
How to mock properly Illuminate\Http\Request class from Laravel
我正在尝试测试来自 class 的方法,其中包含使用来自 Laravel 的 request() 助手的方法。这是方法:
类别class
public function getCanonicalUrl()
{
return preg_match('/\/sale\/./', request()->getRequestUri())
? ''
: url($this->getUrlKey());
}
测试应该使这个助手在执行 getRequestUri() 时正确捕获 URI,但它实际上返回一个空字符串。这是我为测试所做的一千次尝试之一。
测试
public function testCanonical()
{
// ...
$requestMock = Mockery::mock(Request::class)
->shouldReceive('getRequestUri')
->andReturn('/sale/random-string');
$this->app->instance(Request::class, $requestMock);
// ...
}
关于如何实现这一目标的任何想法?
提前致谢。
You should not mock the Request
facade. Instead, pass the input you desire into the HTTP helper methods such as get and post when running your test.
根据 ,
如果
- 你的被测函数接受一个
$request
参数,
- 你不需要对请求做一些奇怪的事情——真正的路由路径对你来说已经足够了
...那么您就不需要“模拟”请求(如嘲讽),
您可以 创建一个 Request
并传递它,例如
public function test_myFunc_condition_expectedResult() {
...
$mockRequest = Request::create('/path/that/I_want', 'GET');
$this->assertTrue($myClass->myFuncThat($mockRequest));
}
我正在尝试测试来自 class 的方法,其中包含使用来自 Laravel 的 request() 助手的方法。这是方法:
类别class
public function getCanonicalUrl()
{
return preg_match('/\/sale\/./', request()->getRequestUri())
? ''
: url($this->getUrlKey());
}
测试应该使这个助手在执行 getRequestUri() 时正确捕获 URI,但它实际上返回一个空字符串。这是我为测试所做的一千次尝试之一。
测试
public function testCanonical()
{
// ...
$requestMock = Mockery::mock(Request::class)
->shouldReceive('getRequestUri')
->andReturn('/sale/random-string');
$this->app->instance(Request::class, $requestMock);
// ...
}
关于如何实现这一目标的任何想法? 提前致谢。
You should not mock the
Request
facade. Instead, pass the input you desire into the HTTP helper methods such as get and post when running your test.
根据
- 你的被测函数接受一个
$request
参数, - 你不需要对请求做一些奇怪的事情——真正的路由路径对你来说已经足够了
...那么您就不需要“模拟”请求(如嘲讽),
您可以 创建一个 Request
并传递它,例如
public function test_myFunc_condition_expectedResult() {
...
$mockRequest = Request::create('/path/that/I_want', 'GET');
$this->assertTrue($myClass->myFuncThat($mockRequest));
}