phpunit在断言两个数组相等时失败,但没有显示任何差异


phpunit fails asserting that two arrays are equal, but shows no difference

以下是phpunit所说的:

1) Asgard'Entity'Tests'EntityTest::testToArray
Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
 Array (
     'id' => null
     'title' => 'Test Title'
     'content' => 'Test Content'
     'published' => 2015-03-04T11:19:50+0000
     'comments' => Array (
         0 => Array (
             'id' => null
             'content' => 'foo'
             'published' => 2015-03-04T11:19:50+0000
             'another_property' => null
             'news' => null
         )
         1 => Array (
             'id' => null
             'content' => 'bar'
             'published' => 2015-03-04T11:19:50+0000
             'another_property' => null
             'news' => null
         )
         2 => Array (
             'id' => null
             'content' => 'baz'
             'published' => 2015-03-04T11:19:50+0000
             'another_property' => null
             'news' => null
         )
     )
     'another_property' => null
 )

https://travis-ci.org/asgardphp/asgard/jobs/53029084

"预期"answers"实际"之间没有区别。测试通常会通过,但有时会失败。

发现问题。元素的顺序不同。虽然有点烦人,但输出没有显示出来。

我已将assertEquals替换为:

$this->assertTrue($this->similar_arrays($arr1, $arr2));
protected function similar_arrays($a, $b) {
    if(is_array($a) && is_array($b)) {
        if(count(array_diff(array_keys($a), array_keys($b))) > 0)
            return false;
        foreach($a as $k => $v) {
            if(!$this->similar_arrays($v, $b[$k]))
                return false;
        }
        return true;
    }
    else
        return $a === $b;
}

由于您在测试中使用了DateTime-您确定没有得到在一秒钟内开始、在另一秒钟内结束的测试,因此时间戳会有第二个差异,这取决于您查看的阶段?-在测试中使用动态日期和时间是偶尔测试失败的常见原因。

检查您的值中是否有EOL。

如果你有这样的值:

'x' => 'line1

线路2'

将其更改为

'x' => "line1'nline2"

注意:这可能不能直接回答OP的问题,但这对我来说是有效的。