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

Posted

技术标签:

【中文标题】PHPUnit 是不是有一些内置的递归数组比较函数?【英文标题】:Does PHPUnit have some inbuilt recursive array comparison function?PHPUnit 是否有一些内置的递归数组比较函数? 【发布时间】:2011-02-25 14:26:45 【问题描述】:

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

用于递归比较数组:

phpUnit 有内置函数吗? 这里有人有一些他们构建的代码可以分享吗? 这将是我必须自己构建的东西吗?

【问题讨论】:

【参考方案1】:

是的。 assertEquals() and assertNotEquals() documentation.

具体来说:

assertEquals()

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

如果两个变量$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);

[编辑]

这是乱序aLists的代码:

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
)

【讨论】:

这是一个要求被比较的数组的键顺序完全相同的函数吗? 因此,如果我想针对已知物品测试乱序数组,我必须确保键匹配,但这是唯一需要注意的地方吗?感谢您的帮助! @wilmoore:你确定? array_values 将重新索引数组并删除任何数组键,但不会重新排序数字数组。 @Mark,只是注意到答案已更新,删除了 array_values 部分。 问题是关于递归比较。您的示例仅提供一维数组。所以问题悬而未决 - asserEqual() 是否支持 多维 数组比较?答案是肯定的。【参考方案2】:

@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');

在这种情况下会通过

它也不考虑任何可能非常复杂的递归。

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

【讨论】:

确实,array_values 技术不起作用。几年前我发帖的时候,所以我不太记得为什么会这样断言。【参考方案3】:

assertEqual 方法头如下所示:

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

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

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

【讨论】:

【参考方案4】:

我在一些生成的带有键的数组上遇到了这个问题——我最终在调用 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

【讨论】:

以上是关于PHPUnit 是不是有一些内置的递归数组比较函数?的主要内容,如果未能解决你的问题,请参考以下文章

数组中的filter函数,递归以及一些应用。

lamba匿名函数与内置函数/递归

python函数装饰器内置函数json及模块

Python学习(十六)内置函数,递归

使用模型的 Casts 数组来验证 PHPUnit 上的模型完整性

使用 PDO SQL INSERT INTO 的 PHPunit 测试函数未定义数组键错误