Laravel中如何断言工厂创建的模型实例的指定方法是否被调用
解决方案
你可以直接基于Factory创建的实例生成仅Mock目标方法的部分Mock,所有原有业务逻辑都会正常执行,仅需验证调用的空方法走Mock逻辑,完全符合你的集成测试要求。
具体实现代码
修改你的测试代码如下:
<?php protected function setUp() : void { parent::setUp(); // 保留原有Factory创建实例逻辑不变 $this->item = Item::factory()->createOne([ "name" => "testing name", // 其他属性 ]); } public function test_the_thing() : void { // 基于已创建的实例生成部分Mock,仅标记需要验证的someMethod为Mock方法 $partialMock = \Mockery::mock($this->item)->makePartial(); // 断言someMethod会被调用1次,入参符合预期(无入参可删除with方法) $partialMock->shouldReceive('someMethod') ->once() ->with('你预期的入参'); // 替换原有实例 $this->item = $partialMock; // 正常执行业务逻辑,所有非Mock方法均走原有真实实现 $this->item->doSomeWork(); // Mockery会在测试结束后自动校验调用符合预期,无需额外手写断言 }
原理解释
makePartial()生成的部分Mock,只有被shouldReceive标记的方法才会走Mock逻辑,其余所有方法、属性都完全保留原有实例的逻辑和值,Factory初始化的所有属性、doSomeWork的业务逻辑、事件触发、监听器逻辑全都是真实运行的,不会出现你担心的「仅测试Mock逻辑」的问题。- Mockery支持直接传入已经初始化完成的实例生成部分Mock,完全兼容Factory的实例创建方式,不需要修改原有实例生成逻辑。
- 如果测试失败,Mockery会直接抛出「调用次数不符合预期」「入参不匹配」的明确错误提示,不需要手动加
dd()验证。
内容的提问来源于stack exchange,提问作者testingtestingtesting
相关产品推荐
相关产品推荐

