如何在 Laravel 中模拟请求类?

Jen*_*ski 7 phpunit mocking laravel

我正在尝试测试一个依赖于的函数

$request->all();
Run Code Online (Sandbox Code Playgroud)

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

['includes' => ['some_val','another_val'] 
Run Code Online (Sandbox Code Playgroud)

在测试中?

mat*_*iti 6

我建议您使用mockery/mockery. 你必须这样做:

在您的测试方法中执行以下操作:

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;
    }
);
Run Code Online (Sandbox Code Playgroud)

你在那里做的是:

  • 将 绑定mockRequest,因此当您yourMethod(Request $request)这样做时,它将实例化您的模拟而不是真正的类
  • 这样做\Mockery::mock(CLASS)->makePartial();将首先创建该类的模拟,然后 ( makePartial()) 将允许您使用其他非模拟方法(使用真实方法),因此您没有模拟的任何方法都将运行真实代码
  • shouldReceive将允许模拟的类模拟该方法( 的参数shouldReceive),因此我们正在模拟all方法并返回您想要的值,在本例中是您发布的数组
  • 最后我们必须返回模拟作为实例

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