我正在尝试测试一个依赖于
$request->all();
在一个方法中。如何模拟请求类
$request->all();
返回['includes' => ['some_val','another_val']
在测试中?
最佳答案
我推荐你使用 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()
)将允许您使用其他非模拟方法可用(使用真实方法),因此您未模拟的任何方法都将运行真实代码。 shouldReceive
将允许模拟类使用模拟方法(shouldReceive
的参数),所以我们正在模拟 all
方法并返回您想要的值,在这种情况下,您发布的数组。 正如@devk 所说,Laravel 不建议模拟
Request
类,所以不要这样做,但如果你需要模拟任何其他对象,你可以使用上面的代码,它会完美地工作。
关于laravel - 如何在 Laravel 中模拟请求类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50375196/