You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pest测试mock模型传入Repository报错:需Model类型却传入Pest\Mock\Mock

解决方案

出现该错误的原因是Pest提供的mock()函数返回的是Pest封装的Mock包装类,仅用于提供更简便的测试预期定义语法,本身没有继承你声明的ModelA/ModelB类,所以直接传入构造函数会触发类型校验失败。你可以通过以下几种方式解决:


方法1:提取包装类内的真实Mock实例

调用Pest Mock包装类的mock()方法,即可拿到内部实际继承了原模型类的Mockery实例,可正常通过类型校验:

$modelA = mock(ModelA::class)->mock();
$modelB = mock(ModelB::class)->mock();

$repo = new MyRepo($modelA, $modelB);

如果你需要为mock定义方法调用预期,链式定义完再调用mock()即可:

$modelA = mock(ModelA::class)
    ->expect('getCount')
    ->andReturn(10)
    ->mock();

方法2:直接使用Mockery原生方法

如果你不需要用到Pest提供的简洁预期语法,可以直接调用Mockery的原生mock函数生成实例,原生实例本身就继承了原类,可直接传入:

$modelA = \Mockery::mock(ModelA::class);
$modelB = \Mockery::mock(ModelB::class);

$repo = new MyRepo($modelA, $modelB);

方法3(Laravel项目适用):通过容器自动注入

如果你的项目是Laravel,可以直接利用服务容器的依赖注入能力,不需要手动实例化Repository:

// 先将mock实例绑定到容器
$this->mock(ModelA::class, function ($mock) {
    $mock->shouldReceive('getCount')->andReturn(10);
});
$this->mock(ModelB::class);

// 从容器解析Repository时会自动注入上面绑定的mock实例
$repo = app(MyRepo::class);

内容的提问来源于stack exchange,提问作者Mistre83

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:15:00