我正在看PHPUnit,以下让我感到疑惑。 PHPUnit是否处理int。 1和0是否为布尔值?在我目前的测试中,它没有。
示例:$this->assertTrue(preg_match('/asdf/', 'asdf'));
在我的测试中,这失败了,因为preg_match()返回int 1或0,如果有错误则只返回bool false。
显然,我接受以下工作,因为比较总是返回bool。 $this->assertTrue(preg_match('/asdf/', 'asdf') === 1);
我是否在preg_match中遗漏了某些内容,或者我的断言使其变得不那么严格了?
编辑: assertTrue是否需要匹配类型?有没有办法让断言不那么严格?
答案 0 :(得分:24)
PHP具有单独的boolean
类型,其值TRUE
和FALSE
(不区分大小写的常量)与整数值1和0不同。
使用严格比较(===
)时,它不起作用:TRUE !== 1
和FALSE !== 0
。
使用类型杂耍时,TRUE
转换为1,FALSE
转换为0(反之亦然,0转换为FALSE
,任何其他整数转换为TRUE
)。所以,TRUE == 1
和FALSE == 0
。
在PHPUnit中,assertTrue
和assertFalse
是类型相关的严格检查。 assertTrue($x)
会检查TRUE === $x
是否与assertSame(TRUE, $x)
相同,而不是assertEquals(TRUE, $x)
。
在您的情况下,一种可能的方法是使用显式类型转换:
$this->assertTrue((boolean)preg_match('/asdf/', 'asdf'));
然而,PHPUnit碰巧有专门的断言来检查正则表达式的字符串:
$this->assertRegExp('/asdf/', 'asdf');
答案 1 :(得分:3)
当有更多特定的测试功能可用时,请不要对复杂函数调用中嵌入的实际逻辑使用一堆assertTrue
或assertFalse
检查。
PHPUnit有一组非常庞大的断言,在它们未被满足的情况下非常有用。它们为您提供了一系列错误的上下文,这有助于您进行调试。
要检查正则表达式,请使用assertRegExp()
(请参阅http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions.assertRegExp)