我需要做的一些测试需要将已知数组与我将要运行的函数得到的结果进行比较。
用于递归地比较数组:
答案 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);