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

Laravel/PHPUnit测试如何配置Mock第二次调用返回不同结果

Mock方法按调用顺序差异化返回结果配置方案

你在Laravel测试中用到的$this->mock()底层基于Mockery实现,原生支持按调用顺序返回不同值,不需要额外扩展。

核心用法

直接把不同调用顺序需要返回的结果,按先后顺序作为参数传入andReturn()即可:

  • 第1次调用该方法时,返回传入的第1个参数
  • 第2次调用该方法时,返回传入的第2个参数
  • 超出传入参数个数的后续调用,默认返回最后一个传入的参数值

对应修改后的测试代码示例:

public function testAPICheck()
{
    $mock = $this->mock(API::class);

    $mock->shouldReceive('checkAPIOnEachModel')
        ->andReturn(
            // 第一个参数:第一次调用返回的成功结果,替换为你业务实际的成功返回值即可
            ['code' => 0, 'msg' => 'success'],
            // 第二个参数:第二次调用返回的失败结果,替换为你业务实际的失败返回值即可
            ['code' => 500, 'msg' => 'API request failed']
        );

    // 后续执行被测方法、编写断言逻辑即可
}

异常场景配置

如果需要模拟某一次调用直接抛出异常(比如第二次调用模拟接口超时、报错),可以链式调用andThrow()按顺序声明规则:

$mock->shouldReceive('checkAPIOnEachModel')
    ->andReturn(['code' => 0, 'msg' => 'success']) // 第一次调用返回成功
    ->andThrow(new \RuntimeException('API connect timeout', 504)); // 第二次调用直接抛出异常

额外提醒:你贴的业务代码存在逻辑问题,foreach循环内第一次迭代就执行了return,代码永远不会进入第二次循环,自然触发不到第二次Mock调用。要验证第二次迭代的失败场景,需要先修正这段业务逻辑,不要在循环首轮直接返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:57:15