laravel - 如何在 Laravel 中模拟请求类?

标签 laravel mocking phpunit

我正在尝试测试一个依赖于

$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;
});

你在那里做的是:
  • 将模拟绑定(bind)到请求,所以当你做 yourMethod(Request $request)它会实例化你的模拟而不是真正的类。
  • \Mockery::mock(CLASS)->makePartial();将首先创建该类的模拟,然后( makePartial() )将允许您使用其他非模拟方法可用(使用真实方法),因此您未模拟的任何方法都将运行真实代码。
  • shouldReceive将允许模拟类使用模拟方法(shouldReceive 的参数),所以我们正在模拟 all方法并返回您想要的值,在这种情况下,您发布的数组。
  • 最后,我们必须将模拟作为实例返回。


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

    关于laravel - 如何在 Laravel 中模拟请求类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50375196/

    相关文章:

    php - MySql 在两个表之间创建简单的外键

    php - laravel 将 find by id 更改为 find by customerid

    unit-testing - 在 Go 中模拟非接口(interface)类型

    PHPUnit 给我 autoload.php not found 异常

    php - Selenium Webdriver和PHPUnit的屏幕截图

    laravel - 由于 html 代码中存在空格,assertSee 失败

    php - Laravel 获取大小数量(如果不存在) 0

    php - 当我在 Laravel 5.8 中使用连接查询时返回重复数据

    java - 模拟在测试中创建的对象内部方法

    python - 如何为 TestCase 设置一次 "return_value"。 Python。 Django