如何在Laravel中模拟请求类?

时间:2018-05-16 15:49:41

标签: laravel mocking phpunit

我试图测试依赖于

的函数
$request->all();

在一种方法中。如何模拟Request类,以便$request->all();返回

['includes' => ['some_val','another_val'] 

在测试中?

3 个答案:

答案 0 :(得分:0)

我建议您使用mockery/mockery

我现在不记得Laravel是否带有它(我想是的)。

无论哪种方式,你都必须这样做:

在方法测试中执行:

app()->bind(\Illuminate\Http\Request::class, function () {
    $mock = \Mockery::mock(\Illuminate\Http\Request::class)->makePartial();
    $mock->shouldReceive('all')->andReturn(['includes' => ['some_val','another_val']]);

    return $mock;
});

你在做什么:

  • 将模拟绑定到Request,所以当你执行yourMethod(Request $request)时,它将实例化你的模拟而不是真正的类。
  • 执行\Mockery::mock(CLASS)->makePartial();将首先创建该类的模拟,然后(makePartial())将允许您使用其他非模拟方法(使用实际方法),所以你做的任何方法和#39; t mocked将运行实际代码。
  • shouldReceive将允许模拟类使用mock方法(shouldReceive的参数),因此我们正在模拟all方法并返回所需的值,在本例中为数组你发布了。
  • 最后我们必须将模拟作为实例返回。

正如@devk所说,Laravel不建议模拟Request类,所以不要这样做,但如果你需要模拟任何其他对象,你可以使用上面的代码,它将完美地工作。

答案 1 :(得分:0)

正如devk所述,不要嘲笑请求。但是Laravel允许你构建一个实际的请求,然后在你的测试中调用你的控制器:

public function testPostRequest() {
    $response = $this->post(
        '/my-custom-route',
        ['includes' => ['some_val','another_val'] 
    );
}

答案 2 :(得分:0)

https://stackoverflow.com/a/61903688/135114, 如果

  1. 您正在测试的函数带有一个$request参数,
  2. 您不需要为Request做一些时髦的事情-真实的路径对您来说已经足够

...那么您无需“嘲笑”一个请求(例如嘲笑),
您可以创建一个Request 并通过它,例如

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