PHPUnit断言真一(1)

时间:2013-09-05 20:51:10

标签: php phpunit assertions

我正在看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是否需要匹配类型?有没有办法让断言不那么严格?

2 个答案:

答案 0 :(得分:24)

PHP具有单独的boolean类型,其值TRUEFALSE(不区分大小写的常量)与整数值1和0不同。

使用严格比较(===)时,它不起作用:TRUE !== 1FALSE !== 0

使用类型杂耍时,TRUE转换为1,FALSE转换为0(反之亦然,0转换为FALSE,任何其他整数转换为TRUE)。所以,TRUE == 1FALSE == 0

在PHPUnit中,assertTrueassertFalse是类型相关的严格检查。 assertTrue($x)会检查TRUE === $x是否与assertSame(TRUE, $x)相同,而不是assertEquals(TRUE, $x)

在您的情况下,一种可能的方法是使用显式类型转换:

$this->assertTrue((boolean)preg_match('/asdf/', 'asdf'));

然而,PHPUnit碰巧有专门的断言来检查正则表达式的字符串:

$this->assertRegExp('/asdf/', 'asdf');

答案 1 :(得分:3)

当有更多特定的测试功能可用时,请不要对复杂函数调用中嵌入的实际逻辑使用一堆assertTrueassertFalse检查。

PHPUnit有一组非常庞大的断言,在它们未被满足的情况下非常有用。它们为您提供了一系列错误的上下文,这有助于您进行调试。

要检查正则表达式,请使用assertRegExp()(请参阅http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions.assertRegExp