【发布时间】:2013-11-03 06:31:30
【问题描述】:
'0' 与 false 比较时assertEquals() 失败,但将'1' 与true 比较时通过
$this->assertEquals( '0', false ); // fails
$this->assertEquals( '1', true ); // passes
谁能解释一下?
【问题讨论】:
'0' 与 false 比较时assertEquals() 失败,但将'1' 与true 比较时通过
$this->assertEquals( '0', false ); // fails
$this->assertEquals( '1', true ); // passes
谁能解释一下?
【问题讨论】:
字符串不是假的,也不是真的。 PHPUnit 完全相等,所以即使 1 也不等于 true。
PHPUnit 在比较时使用 ===(三等号)运算符,因此只有 TRUE === TRUE,而不是 1。
【讨论】:
assertEquals()通过了?
PHPUnit 有非常复杂的断言系统。对于这种情况,将使用 PHPUnit_Framework_Comparator_Scalar 类,其中包含以下代码:
public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
{
$expectedToCompare = $expected;
$actualToCompare = $actual;
// always compare as strings to avoid strange behaviour
// otherwise 0 == 'Foobar'
if (is_string($expected) || is_string($actual)) {
$expectedToCompare = (string)$expectedToCompare;
$actualToCompare = (string)$actualToCompare;
// omitted
}
if ($expectedToCompare != $actualToCompare) {
throw new PHPUnit_Framework_ComparisonFailure(
// omitted
);
}
}
如果其中一个值是字符串,则它们都转换为字符串。
var_dump((string)false); // string(0) ""
var_dump((string)true); // string(1) "1"
【讨论】: