Unit testing 如何模拟Laravel雄辩模型的静态方法?

Unit testing 如何模拟Laravel雄辩模型的静态方法?,unit-testing,laravel,eloquent,mockery,Unit Testing,Laravel,Eloquent,Mockery,我的代码中有这样一行: ModelName::create($data); $client_mock = \Mockery::mock('overload:App\Models\ModelName'); $client_mock->shouldReceive('create')->with($data)->andReturn($returnValue); 其中ModelName只是一个有说服力的模型。有没有办法在单元测试中模拟这个调用?我试过: $client_mock =

我的代码中有这样一行:

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

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

但是它不起作用。

你应该这样做:

ModelName::create($data);
$client_mock = \Mockery::mock('overload:App\Models\ModelName');
$client_mock->shouldReceive('create')->with($data)->andReturn($returnValue);
我们使用的是
重载:
,因为您不想将mock传递给某个类,但也希望在硬编码到某些类中时使用它

除了您的测试类(就在
之前),您还应该添加:

/**
 * @runTestsInSeparateProcesses
 * @preserveGlobalState disabled
 */
为避免此类已加载的错误(在单个测试中没有此类可能会工作,但在运行多个测试时可能不会)

你可以阅读有关它的详细信息

更新

在某些情况下,可能无法使用此方法模拟类。在这些情况下,您可以创建一个普通的mock(没有
重载
),并将其注入服务容器,如下所示:

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

是打字错误吗<代码>->andReturn(…)嗯,我尝试了你的方法,但我得到的是
mockry\Exception\RuntimeException:无法加载mock App\Models\ModelName,类已经存在
。我已经添加了@runTestsInSeparateProcesses和@preserveGlobalState。@您应该确保它是测试中的第一行。如果您已经使用ModelName执行了其他操作-直接在方法中或在其他位置(例如
setUp
method)它将无法工作,因为它将首先创建真实对象,下次将无法重载它。在模拟公共静态方法调用时,应使用
别名:App\Models\ModelName
而不是
重载:\Models\ModelName
<代码>重载用于拦截和模拟类实例化(例如新类()),而
别名
用于公共静态方法(类::方法)。@Zed如果仍然存在此问题,您可以查看我的更新答案
/***@runinsepareprocess*@preserveGlobalState disabled*/