PHP,会比较print_r输出工作的MD5s来测试结果吗?

时间:2011-02-22 22:51:08

标签: php unit-testing

我正在使用代码点火器并尝试为我的模型返回的数据编写测试; CI的测试库在检查时非常有限,所以我一直这样做:

$test     = "My Test Name";
$expected = md5(print_r(array(array('val','other'), array('new','old','blue')), 1));
$result   = md5(print_r($this->model->method($data), 1));

if($expected == $result) {
    echo "$test [pass]";
}
else {
    echo "$test [fail]";
}

这种方式测试是否有任何陷阱?是否有一个首选的简单库,可以使用我找不到的CI?内置的测试库不允许您使用这种精细的粒度检查结果,因此我发现它不是非常有用。

3 个答案:

答案 0 :(得分:2)

是的,这应该可以正常工作,就像两者都是相同的一样,哈希也应该是相同的。

但是,为什么不直接检查print_r的输出?或者,就此而言,使用完全独立的工具(如PhpUnit进行测试?

答案 1 :(得分:0)

假设您要比较的两个变量都是数组,请查看内置的array_diff()函数(http://php.net/manual/en/function.array-diff.php)。如果您还需要比较数组的索引,请改用array_diff_assoc()

但是,如果你想要一个完整的检查测试多维数组(就像你的那样),这里有一个应该为你做的功能:

function compare_arrays($first_array, $second_array, $compare_keys = false){
    /* Test if arrays are actually arrays */
    if(!is_array($first_array)){
        // Elements are not arrays
        if(is_array($second_array)){
            // Second array is not array
            return false;
        }

        if($first_array == $second_array){
            return true;
        }
    } elseif(!is_array($second_array)){
        // Second array is not array (first is)
        return false;
    }

    /* Test same number of elements */
    if(count($first_array) != count($second_array)){
        return false;
    }

    $size = count($first_array);
    if($compare_keys){
        // Load keys to compare
        $first_keys = array_keys($first_array);
        $second_keys = array_keys($second_array);
    }

    for($i = 0; $i < $size; $i++){
        if($compare_keys && $first_keys[$i] != $second_keys[$i]){
            // Keys do not match
            return false;
        }

        if(is_array($first_array[$i])){
            // Element is array
            if(!is_array($second_array[$i])){
                // Matching element in other array is not array
                return false;
            }

            $result = compare_arrays($first_array[$i], $second_array[$i], $compare_keys);
            if(!$result){
                // Sub-arrays do not match
                return false;
            }

            // Match - skip iteration
            continue;
        } elseif(is_array($second_array[$i])){
            // Second array element is array (first is not)
            return false;
        }

        // Elements are not arrays
        if($first_array[$i] != $second_array[$i]){
            return false;
        }
    }

    // Match
    return true;
}

用法:

$br = '<br />';
$array_one = array(4, 5, array(2, 5), 'hello', 'element');

if(compare_arrays($array_one, $array_one)){
    echo 'Match 1'.$br;
} else {
    echo 'No Match 1'.$br;
}

$array_two = array(5, 5, array(2, 5), 'hello', 'element'); // Slightly different

if(compare_arrays($array_one, $array_two)){
    echo 'Match 2'.$br;
} else {
    echo 'No Match 2'.$br;
}

/* Output:
    Match 1
    No Match 2
*/

答案 2 :(得分:0)

if($array1 === $array2) { 
       # the arrays are matched with identical keys and values 
       # no matter how deeply nested
}

不需要散列。