我的代码中有这样一行:

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)并将其注入服务容器,如下所示:

App::instance('\App\Models\ModelName', $client_mock);

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

10-09 06:16
查看更多