我的PHPUnit测试失败了:PHPUnit_Framework_Error_Notice : Array to string conversion
因为我正在比较大型数组:
$this->assertEquals(array(), array_diff($expected, $result));
我已经尝试更改它以便我比较序列化的字符串,但它也会失败,即使我使用var_export($ result)并按原样将它放在$ expected中。
PHPUnit_Framework_ExpectationFailedException : Failed asserting that two strings are equal.
Expected :a:1:{s:8:"somename";a:2:{s:13:"property_name";s:8:"somename";s:15:"possible_values";a:2:{i:0;i:1;i:3;i:2;}}}
Actual :a:1:{s:8:"somename";a:2:{s:13:"property_name";s:8:"somename";s:15:"possible_values";a:2:{s:1:"0";i:1;s:1:"3";i:2;}}}
我意识到'possible_values'嵌套键中某些键的整数/字符串转换很可能存在问题。我尝试了不同的possible_values键组合,例如。 '0'=> 1,0 => 1,0 =>“1”等。
您能否推荐更好的嵌套数组比较方法,或解释如何使其通过。
$ result的var_export给了我:
array (
'somename' =>
array (
'property_name' => 'somename',
'possible_values' =>
array (
'0' => 1,
'3' => 2,
),
),
)
P.S。 $this->assertEquals($expected, $result);
在PHPUnit中也失败了,即使我在PHPStorm中打开差异时,它说内容是相同的
PHPUnit_Framework_ExpectationFailedException : Failed asserting that two arrays are equal.
答案 0 :(得分:0)
目前我已经诉诸:
$expected = 'a:1:{s:8:"somename";a:2:{s:13:"property_name";s:8:"somename";s:15:"possible_values";a:2:{s:1:"0";i:1;s:1:"3";i:2;}}}';
$this->assertEquals($expected, serialize($result));
答案 1 :(得分:0)
您可以使用$expected
中的字符串键匹配$actual
或在测试中转换它们。顺便说一下,你是如何创建$expected
的?如果您手动将其键入测试,请首先使用字符串键。
assertEquals(self::fixPossibleValuesKeys($expected), $actual);
static function fixPossibleValuesKeys($array) {
$original = $array['somename']['possible_values'];
$fixed = array();
foreach ($original as $k => $v) {
$fixed[strval($k)] = $v;
}
$array['somename']['possible_values'] = $fixed;
return $array;
}
注意这是可怕的代码,必须加入您的测试!无论是更改测试中的代码还是返回更有用的东西(除非字符串键是你想要的东西)或者从一开始就用正确的期望值构建测试夹具,你会好得多。您的测试应尽可能少地执行逻辑,因为该代码将未经测试。