PHPUnit测试失败,断言两个数组相等,但未显示差异。

7

这是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"没有区别。测试通常会通过,但有时会失败。


测试在 PHP 5.6 上总是失败吗? - Matteo
到目前为止,是的,我只看到它在php 5.6上失败了。 - leyou
我还没有安装PHP 5.6。使用5.5和5.3版本,我无法复制您的问题。 - Matteo
实际上刚刚发生在5.4版本:https://travis-ci.org/asgardphp/asgard/jobs/54541383 - leyou
3个回答

5

我找到了问题所在。元素的顺序不同。有点烦人的是输出没有显示出来。

我已经用以下代码替换了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;
}

1

检查您的值中是否有行尾结束符(EOL)。

如果您有这样的一个值:

'x' => 'line1

第二行'

将其更改为

'x' => "line1\nline2"

注意:这可能不能直接回答原帖的问题,但这是对我有效的解决方案。

1

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


datetime对象仅生成一次,并且实际结果和预期结果都使用它。而且,即使这是问题,phpunit也应该显示预期/实际之间的差异。 - leyou
非常感谢,如果没有datetimes可能会浪费数小时的提示,我的问题有点不同,我使用了laravel的默认转换(Carbon),在使用不同格式(iso8601)后它可以工作。 - Maaaaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接