由于密钥类型,与var_export和serialize的嵌套数组比较失败

时间:2014-01-10 15:21:18

标签: php arrays serialization phpunit

我的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.

2 个答案:

答案 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;
}
  

注意这是可怕的代码,必须加入您的测试!无论是更改测试中的代码还是返回更有用的东西(除非字符串键你想要的东西)或者从一开始就用正确的期望值构建测试夹具,你会好得多。您的测试应尽可能少地执行逻辑,因为该代码将未经测试。