Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何正确模拟Laravel的\Http\Request类_Php_Laravel_Unit Testing_Mocking_Mockery - Fatal编程技术网

Php 如何正确模拟Laravel的\Http\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()时正确捕

我试图从一个类中测试一个方法,该类包含一个使用来自Laravel的request()助手的方法。方法如下:

类别类别

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
    参数,然后
  • 你不需要对请求做一些奇怪的事情,真正的路由路径对你来说已经足够好了
  • 。。。然后,您不需要“模拟”请求(如mocky中的请求),
    您可以创建一个
    请求
    并传递它,例如

    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)
    是解决这个问题的正确而简单的方法。谢谢