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

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会在测试结束后自动校验调用符合预期,无需额外手写断言
}

原理解释

  1. makePartial() 生成的部分Mock,只有被shouldReceive标记的方法才会走Mock逻辑,其余所有方法、属性都完全保留原有实例的逻辑和值,Factory初始化的所有属性、doSomeWork的业务逻辑、事件触发、监听器逻辑全都是真实运行的,不会出现你担心的「仅测试Mock逻辑」的问题。
  2. Mockery支持直接传入已经初始化完成的实例生成部分Mock,完全兼容Factory的实例创建方式,不需要修改原有实例生成逻辑。
  3. 如果测试失败,Mockery会直接抛出「调用次数不符合预期」「入参不匹配」的明确错误提示,不需要手动加dd()验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:39:00