PHPUnit是否有一些内置的递归数组比较函数?
我需要做的一些测试需要将已知数组与我将要运行的函数得到的结果进行比较 用于递归比较数组:PHPUnit是否有一些内置的递归数组比较函数?,php,unit-testing,recursion,multidimensional-array,phpunit,Php,Unit Testing,Recursion,Multidimensional Array,Phpunit,我需要做的一些测试需要将已知数组与我将要运行的函数得到的结果进行比较 用于递归比较数组: PHPUnit是否具有内置功能 这里有人有他们自己构建的代码来共享吗 这是我必须自己建造的东西吗 是的,是的 具体而言: assertEquals() 如果两个变量$expected和$actual不相等,则报告由$message标识的错误 assertNotEquals()与此断言相反,并采用相同的参数 测试代码: public function testArraysEqual() { $arr
- PHPUnit是否具有内置功能
- 这里有人有他们自己构建的代码来共享吗
- 这是我必须自己建造的东西吗
$expected
和$actual
不相等,则报告由$message
标识的错误
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
)
@威尔摩尔
$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');
在这种情况下会通过
它也没有考虑任何可能会非常复杂的递归
根据复杂性,从长远来看,实现自己的断言函数可能更容易。我在一些生成的带有键的数组中遇到了这个问题-我在调用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
assertEqual
方法头如下所示:
public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
如果canonicalize参数设置为true,那么数组将首先通过sort()
运行,如果键是任意的,并且只有值才重要,那么这是可用的
但是,在查看数组比较器代码之后,
assertEqual
实际上并不关心关联数组的顺序:)它只会在结果数组中查找预期的键,然后比较这些键的值。这是一个函数,它要求被比较的数组的键的顺序完全相同吗?因此,如果我想测试一个无序数组和一个已知的商品,我必须确保键匹配,但这是唯一的警告?谢谢你的帮助@威尔摩尔:你确定array\u values
将对数组重新编制索引并删除所有数组键,但它不会对数值数组重新排序。@请注意,答案已更新,删除了array\u values
部分。问题是关于递归比较的。您的示例仅提供一维数组。因此,问题仍然存在——AsserQual()是否支持多维数组比较?答案是肯定的。array\u values
技术确实不起作用。这是几年前,我张贴,所以我不太记得为什么这是断言。
public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)