我的代码中有这样一行:
ModelName::create($data);
其中ModelName只是一个Eloquent
模型。有没有办法在单元测试中模拟这个调用?我尝试过:
$client_mock = \Mockery::mock('Eloquent','App\Models\ModelName');
$client_mock->shouldReceive('create')
->with($data)->andReturns($returnValue);
但它没有用。
答案 0 :(得分:12)
你应该这样做:
$client_mock = \Mockery::mock('overload:App\Models\ModelName');
$client_mock->shouldReceive('create')->with($data)->andReturn($returnValue);
我们正在使用overload:
因为您不想将mock传递给某个类,但是如果它被硬编码到某些类中,您也希望使用它。
除了您的测试类(就在class
之前),您应该添加:
/**
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
*/
以避免此类已经加载的错误(在单次测试中可能没有它,但是当您运行多个测试时可能不会)。
您可以阅读Mocking hard dependencies了解相关详情。
<强>更新强>
在某些情况下,可能无法使用此方法模拟类。在这些情况下,您可以创建一个普通的模拟(没有overload
)并将其注入服务容器,如下所示:
App::instance('\App\Models\ModelName', $client_mock);