PHPUnit有一些内置的递归数组比较函数吗?

时间:2010-05-30 01:10:54

标签: php unit-testing recursion multidimensional-array phpunit

我需要做的一些测试需要将已知数组与我将要运行的函数得到的结果进行比较。

用于递归地比较数组:

  • PHPUnit是否具有内置功能?
  • 这里有人有他们构建的代码可以分享吗?
  • 这是我必须自己构建的吗?

5 个答案:

答案 0 :(得分:25)

是的。 assertEquals() and assertNotEquals() documentation

具体做法是:

  

的assertEquals()

assertEquals(mixed $expected, mixed $actual[, string $message = ''])
     

如果两个变量$message$expected不相等,则报告$actual标识的错误。

     

assertNotEquals()与此断言相反,并采用相同的参数。

测试代码:

public function testArraysEqual() {
    $arr1 = array( 'hello' => 'a', 'goodbye' => 'b');
    $arr2 = array( 'hello' => 'a', 'goodbye' => 'b');

    $this->assertEquals($arr1, $arr2);
}

public function testArraysNotEqual() {
    $arr1 = array( 'hello' => 'a', 'goodbye' => 'b');
    $arr2 = array( 'hello' => 'b', 'goodbye' => 'a');

    $this->assertNotEquals($arr1, $arr2);
}

<强> [编辑]

以下是无序列表的代码:

public function testArraysEqualReverse() {
    $arr1 = array( 'hello' => 'a', 'goodbye' => 'b');
    $arr2 = array( 'goodbye' => 'b', 'hello' => 'a');

    $this->assertEquals($arr1, $arr2);
}

此测试失败:

public function testArraysOutOfOrderEqual() {
    $arr1 = array( 'a', 'b');
    $arr2 = array( 'b', 'a');

    $this->assertEquals($arr1, $arr2);
}

留言:

Failed asserting that 
Array
(
    [0] => b
    [1] => a
)
 is equal to 
Array
(
    [0] => a
    [1] => b
)

答案 1 :(得分:4)

@wilmoore

$array1 = array('hi','hi2');
$array2 = array('hi2','hi');
$this->assertEquals(array_values($array1), array_values($array2));

会失败。

@Ben Dauphinee

可能值得查看assertContains(mixed $needle, array $haystack)但是你必须遍历两个数组并将每个元素与另一个数组进行比较以确保它包含所有必需的元素而不包含其他元素,但这不会占包含两个相同元素的数组

$array1 = array('hi','hi2','hi');
$array2 = array('hi2','hi');
在这种情况下

会传递

它也没有考虑任何进一步的递归,这可能是非常复杂的处理。

从长远来看,根据复杂性可能更容易实现自己的断言功能。

答案 2 :(得分:1)

我遇到了一些带键的生成数组的问题 - 在调用assertEquals之前,我最终通过ksort传递了预期的数组和正在测试的数组。但是,这对递归数组不起作用。

$expectedArray = array('foo' => 1, 'bar' => 0);
$array = array('bar' => 0, 'foo' => 1);

ksort($expectedArray);
ksort($array);

var_dump($expectedArray); // outputs array('bar' => 0, 'foo' => 1);
var_dump($array); // outputs array('bar' => 0, 'foo' => 1);

$this->assertEquals($expectedArray, $array); // passes

答案 3 :(得分:1)

assertEqual方法头看起来像这样:

public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)

如果canonicalize参数设置为true,则数组将首先运行sort(),如果键是任意的并且只有值很重要,则可以使用它。

然而,在查看数组比较器代码之后,assertEqual实际上并不关心关联数组的顺序:)它只是在结果数组中查找期望的键,然后比较值那些钥匙。

答案 4 :(得分:-1)

有时我会这样做:

$arrayResult = [....];
$arrayExpected = [....];

ksort($arrayResult); // or sort() for associative arrays
ksort($arrayExpected); 

self::assertSame($arrayExpected, $arrayResult);