Php 如何正确模拟Laravel的\Http\Request类
我试图从一个类中测试一个方法,该类包含一个使用来自Laravel的request()助手的方法。方法如下: 类别类别Php 如何正确模拟Laravel的\Http\Request类,php,laravel,unit-testing,mocking,mockery,Php,Laravel,Unit Testing,Mocking,Mockery,我试图从一个类中测试一个方法,该类包含一个使用来自Laravel的request()助手的方法。方法如下: 类别类别 public function getCanonicalUrl() { return preg_match('/\/sale\/./', request()->getRequestUri()) ? '' : url($this->getUrlKey()); } 测试应该使这个助手在执行getRequestUri()时正确捕
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);
// ...
}
你对如何实现这一目标有何想法?
提前谢谢
您不应该模拟请求
外观。相反,在运行测试时,将所需的输入传递到HTTP帮助器方法中,例如get和post
根据,
如果
$request
参数,然后您可以创建一个
请求并传递它,例如
public function test\u myFunc\u condition\u expectedResult(){
...
$mockRequest=Request::create('/path/that/I_-want',GET');
$this->assertTrue($myClass->myFuncThat($mockRequest));
}
所以$this->get($path)
是解决这个问题的正确而简单的方法。谢谢