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

