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

问题描述 投票:0回答:4

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

用于递归比较数组:

  • PHPUnit 有内置函数吗?
  • 这里有人有一些他们构建的代码可以分享吗?
  • 这是我必须自己构建的东西吗?
php unit-testing recursion multidimensional-array phpunit
4个回答
28
投票

是的,确实如此。

assertEquals()
assertNotEquals()
文档

具体:

断言等于()

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);
}

这是无序 aList 的代码:

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
)

4
投票

@威尔莫尔

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

将会失败。

@本·多菲尼

可能值得一看

assertContains(mixed $needle, array $haystack)
,但是您必须循环遍历两个数组并将每个元素与另一个数组进行比较,以确保它包含所有必需的元素而没有其他元素,但这并不能解释包含两个数组的数组相同的元素

$array1 = array('hi','hi2','hi');
$array2 = array('hi2','hi');

在这种情况下会通过

它也没有考虑任何进一步的递归,处理起来可能会相当复杂。

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


2
投票

assertEqual
方法头看起来像这样:

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

如果canonicalize参数设置为true,数组将首先运行

sort()
,如果键是任意的并且只有值很重要,那么这是可用的。

然而,在查看了数组比较器代码之后,

assertEqual
实际上并不关心关联数组的顺序:)它只会在结果数组中查找预期的键,然后比较这些键的值。


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
© www.soinside.com 2019 - 2024. All rights reserved.