【问题标题】:PHPUnit very odd resultsPHPUnit 很奇怪的结果
【发布时间】:2013-11-03 06:31:30
【问题描述】:

'0' 与 false 比较时assertEquals() 失败,但将'1' 与true 比较时通过

$this->assertEquals( '0', false ); // fails
$this->assertEquals( '1', true );  // passes

谁能解释一下?

【问题讨论】:

    标签: phpunit equality


    【解决方案1】:

    字符串不是假的,也不是真的。 PHPUnit 完全相等,所以即使 1 也不等于 true。

    PHPUnit 在比较时使用 ===(三等号)运算符,因此只有 TRUE === TRUE,而不是 1。

    【讨论】:

    • 为什么第二个assertEquals()通过了?
    • 记住变量的顺序。 '1' 是预期的结果。 '1' 是一个字符串。您正在评估一个 TRUE 是一个字符串。这是根据以下答案中的@STLMikey 传递的。
    【解决方案2】:

    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"
    

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 1970-01-01
      • 2018-03-11
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多