我需要做的一些測試將需要比較一個已知數組和我將運行的函數的結果。PHPUnit有一些內置的遞歸數組比較函數嗎?
對於遞歸比較數組:
- 確實PHPUnit的有一個內置的功能?
- 這裏有人有一些代碼,他們已經構建分享?
- 這是我必須自己構建的東西嗎?
我需要做的一些測試將需要比較一個已知數組和我將運行的函數的結果。PHPUnit有一些內置的遞歸數組比較函數嗎?
對於遞歸比較數組:
是的。 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);
}
[編輯]
這裏是無序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
$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');
「的陣列噸帳戶將通過在這種情況下
它也沒有考慮任何進一步的遞歸這可能將是非常complica應對。
根據複雜性,從長遠來看,實現自己的斷言功能可能會更容易。
的確,'array_values'技術將無法工作。這是幾年前我發佈的,所以我不完全記得爲什麼這樣說。 – 2013-12-16 22:45:16
我有這個問題與一些生成的數組與鍵 - 我最終通過期望的數組和通過ksort測試數組傳遞之前調用assertEquals。儘管如此,這對遞歸數組不起作用。
$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)
如果。規範化參數被設置爲真陣列將通過sort()
運行第一,這是可用的,如果鍵是任意的,並且僅價值很重要。
但是,在查看數組比較器代碼後,assertEqual
實際上並不關心相關數組的順序:)它只會在結果數組中查找期望的鍵,然後比較這些鍵的值。
有時我會做這樣的:
$arrayResult = [....];
$arrayExpected = [....];
ksort($arrayResult); // or sort() for associative arrays
ksort($arrayExpected);
self::assertSame($arrayExpected, $arrayResult);
這是需要比較的陣列位於完全相同關鍵的相同順序鍵的功能? – 2010-05-30 02:14:59
有趣的問題... – Gutzofter 2010-05-30 03:04:34
所以,如果我想測試一個無序陣列對已知的好,我將不得不確保密鑰匹配,但這是唯一的警告?謝謝您的幫助! – 2010-05-30 12:49:46