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
相关产品推荐
相关产品推荐

