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

PHPUnit如何正确校验链式调用的register方法的调用参数与次数

问题根因

你的报错是由链式调用的mock返回值不符合预期导致的:

  • PHPUnit默认生成的类A mock对象,register方法未指定返回值时会默认返回null
  • 业务代码中register采用链式调用写法,第一次调用mock的register后返回null,后续三次->register()调用根本没有触发类A的register方法,因此实际仅调用1次
修复方案

仅需要在测试的mock期望逻辑中,指定register方法调用后返回mock对象本身即可,不需要修改业务层的register方法:

class ExampleTest extends TestCase
{
    public function testFooBar()
    {
        $mock = $this->createMock(A::class);
        $mock->expects(self::exactly(4))
            ->method("register")
            ->withConsecutive(
                [self::isInstanceOf(D::class)],
                [self::isInstanceOf(E::class)],
                [self::isInstanceOf(F::class)],
                [self::isInstanceOf(G::class)]
            )
            ->willReturn($mock); // 新增这行,每次调用返回mock自身,支持链式调用

        (new Example($mock))->fooBar();
    }
}
额外注意项

你贴出的Example类构造方法存在笔误,属性赋值多写了$符号,也可能导致意外问题:

// 错误写法
$this->$a = $a;
// 正确写法
$this->a = $a;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:57:00