PHPUnit:assertThat()是否增加断言计数?自定义断言计数异常解决
解决自定义断言无法增加PHPUnit断言计数的问题
我之前也遇到过一模一样的困扰!问题的核心在于:assertThat()是PHPUnit的底层约束执行方法,它本身不会自动更新断言计数器。那些内置的断言方法(比如assertEquals()、assertTrue())之所以能正常计数,是因为它们在内部除了调用assertThat()之外,还手动调用了断言计数的方法。
具体解决方案
你只需要在自定义断言方法里,手动添加一行代码来增加断言计数就行,不同PHPUnit版本对应的方法略有区别:
针对PHPUnit 8及更早版本
在调用assertThat()之后(或者之前,顺序不影响),添加$this->addToAssertionCount(1);:
protected function assertMethodResult($class_name, $method_name, $arguments, $expected, $message='') { $condition = new MyConstraint; // proprietary code; extension of PHPUnit_Framework_Constraint self::assertThat(array('class_name'=>$class_name, 'method_name'=>$method_name, 'arguments'=>$arguments, 'expected'=>$expected), $condition, $message); // 手动增加断言计数 $this->addToAssertionCount(1); }
针对PHPUnit 9及以上版本
新版本的PHPUnit调整了计数方法,改用recordAssertion():
protected function assertMethodResult($class_name, $method_name, $arguments, $expected, $message='') { $condition = new MyConstraint; // proprietary code; extension of PHPUnit_Framework_Constraint self::assertThat(array('class_name'=>$class_name, 'method_name'=>$method_name, 'arguments'=>$arguments, 'expected'=>$expected), $condition, $message); // 手动记录断言 $this->recordAssertion(); }
为什么这样有效?
PHPUnit的断言计数系统并不是自动追踪assertThat()的调用,而是依赖每个断言方法主动上报。内置断言都做了这个步骤,而自定义断言因为直接调用底层方法,所以需要我们手动补上。
这样修改后,不管你的断言成功还是失败,计数器都会正确增加——哪怕断言失败抛出异常,计数方法已经执行过了,所以会被正常统计进去。
内容的提问来源于stack exchange,提问作者Jay Bienvenu
相关产品推荐
相关产品推荐

