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

Posted

技术标签:

【中文标题】如何从 Laravel 正确模拟 Illuminate\\Http\\Request 类【英文标题】:How to mock properly Illuminate\Http\Request class from Laravel如何从 Laravel 正确模拟 Illuminate\Http\Request 类 【发布时间】:2018-05-26 09:50:45 【问题描述】:

我正在尝试从包含使用 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);

    // ...

关于如何实现这一点的任何想法? 提前致谢。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

所以$this->get($path) 是解决此问题的正确且简单的方法。谢谢【参考方案2】:

根据https://***.com/a/61903688/135114, 如果

    您的被测函数采用$request 参数,并且 您不需要对请求做一些时髦的事情 - 真正的路由路径对您来说已经足够好了

...那么您不需要“模拟”请求(例如,嘲弄), 你可以创建一个Request并传递它,例如

public function test_myFunc_condition_expectedResult() 
    ...
    $mockRequest = Request::create('/path/that/I_want', 'GET'); 
    $this->assertTrue($myClass->myFuncThat($mockRequest));

【讨论】:

以上是关于如何从 Laravel 正确模拟 Illuminate\Http\Request 类的主要内容,如果未能解决你的问题,请参考以下文章

如何以正确的方式从 laravel 5 url 重写或删除 public?

如何在 PHPUnit / Laravel 中模拟 JSON 文件

如何正确地将数据从 vue 组件发布到 laravel 控制器

如何从不同的表中获取 customer_id 并在 laravel 中使用正确的方法避免重复?

如何正确地将排序模型从我的控制器发送到 Laravel API 资源集合?

弗拉特利定律:Illumina怎样缔造基因革命