14

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

4

2 回答 2

29

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');
于 2013-09-05T21:57:49.003 回答
4

当有更具体的测试功能可用时,请不要在复杂的函数调用中使用一堆assertTrue或检查嵌入的真实逻辑。assertFalse

PHPUnit 有一组非常庞大的断言,在不满足它们的情况下非常有用。它们为您提供了一堆问题的上下文,这有助于您进行调试。

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

于 2013-09-05T20:58:44.460 回答