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

"expected"和"actual"没有区别。测试通常会通过,但有时会失败。

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

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

我已将 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;
}

检查您的值中是否有 EOL。

如果您有这样的值:

'x' => 'line1

第 2 行'

改为

'x' => "line1\nline2"

注意:这可能无法回答 OP 的直接问题,但这对我有用。