我试图测试依赖于
的函数$request->all();
在一种方法中。如何模拟Request类,以便$request->all();
返回
['includes' => ['some_val','another_val']
在测试中?
答案 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;
});
你在做什么:
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, 如果
$request
参数, ...那么您无需“嘲笑”一个请求(例如嘲笑),
您可以创建一个Request
并通过它,例如
public function test_myFunc_condition_expectedResult() {
...
$mockRequest = Request::create('/path/that/I_want', 'GET');
$this->assertTrue($myClass->myFuncThat($mockRequest));
}