gpt4 book ai didi

unit-testing - 如何模拟 Laravel Eloquent 模型的静态方法?

转载 作者:行者123 更新时间:2023-12-04 03:03:16 24 4
gpt4 key购买 nike

我的代码中有这样一行:

ModelName::create($data);

其中 ModelName 只是一个 Eloquent模型。有没有办法在单元测试中模拟这个调用?我试过:
$client_mock = \Mockery::mock('Eloquent','App\Models\ModelName');
$client_mock->shouldReceive('create')
->with($data)->andReturns($returnValue);

但它不起作用。

最佳答案

你应该这样做:

$client_mock = \Mockery::mock('overload:App\Models\ModelName');
$client_mock->shouldReceive('create')->with($data)->andReturn($returnValue);

我们正在使用 overload:因为您不想将模拟传递给某个类,但您也想使用它以防它被硬编码到某些类中。

除了您的测试类(就在 class 之前),您还应该添加:
/**
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
*/

以避免此类已加载的错误(在单个测试中没有它可能会工作,但当您运行多个测试时可能不会)。

您可能会阅读 Mocking hard dependencies有关它的详细信息。

更新

在某些情况下,可能无法使用此方法模拟类。在这些情况下,您可以创建一个普通的模拟(没有 overload )并将其注入(inject)服务容器,如下所示:
App::instance('\App\Models\ModelName', $client_mock); 

关于unit-testing - 如何模拟 Laravel Eloquent 模型的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37456518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com