2010-05-30 17 views
18

Niektóre z testów, które będę musiał wykonać, będą wymagały porównania znanej tablicy z wynikiem, który otrzymuję z funkcji, które będę obsługiwał.Czy PHPUnit ma wbudowaną funkcję porównywania tablic rekurencyjnych?

Dla porównania tablic rekurencyjnie:

  • Does PHPUnit posiada wbudowaną funkcję?
  • Czy ktoś tutaj ma jakiś kod, który został stworzony do udostępnienia?
  • Czy to będzie coś, co będę musiał sam skonstruować?

Odpowiedz

19

Tak jest. assertEquals() and assertNotEquals() documentation.

szczególności:

assertEquals()

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

zgłasza błąd zidentyfikowany przez $message jeżeli obie zmienne $expected i $actual nie są równe.

assertNotEquals() jest odwrotnością tego asercji i przyjmuje te same argumenty.

Code Test:

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

[EDIT]

Oto kod do wyczerpania alists zamówienia:

public function testArraysEqualReverse() { 
    $arr1 = array('hello' => 'a', 'goodbye' => 'b'); 
    $arr2 = array('goodbye' => 'b', 'hello' => 'a'); 

    $this->assertEquals($arr1, $arr2); 
} 

Ten test nie powiedzie się:

public function testArraysOutOfOrderEqual() { 
    $arr1 = array('a', 'b'); 
    $arr2 = array('b', 'a'); 

    $this->assertEquals($arr1, $arr2); 
} 

z komunikatem:

Failed asserting that 
Array 
(
    [0] => b 
    [1] => a 
) 
is equal to 
Array 
(
    [0] => a 
    [1] => b 
) 
+1

Jest to funkcja, która wymaga tablice porównywanych się dokładnie w tym samym kluczu zamówienia na klucz? –

+0

Interesujące pytanie ... – Gutzofter

+0

Więc jeśli chcę przetestować tablicę nieumieszczoną na znanym towarze, będę musiał upewnić się, że klucze pasują, ale to jest jedyne zastrzeżenie? Dzięki za pomoc! –

3

@wilmoore

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

zawiedzie.

@Ben Dauphinee

Może warto patrząc na assertContains(mixed $needle, array $haystack) ale trzeba by pętli obu tablicach i porównać każdy element z drugiej tablicy, aby upewnić się, że zawierał wszystkie wymagane elementy i żadnych innych, to jednak Wouldn „t uwagę tablica zawierająca dwa identyczne elementy

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

przejdzie w tym przypadku

również nie uwzględnia jakiegokolwiek dalszego rekursji które prawdopodobnie byłyby dość complica do załatwienia.

W zależności od złożoności może być łatwiej na dłuższą metę, aby wdrożyć własną funkcję potwierdzenia.

+0

w rzeczywistości technika 'array_values' nie będzie działać. To było lata temu, kiedy opublikowałem, więc nie do końca pamiętam, dlaczego tak twierdzono. –

1

Miałem ten problem z niektórymi wygenerowanymi tablicami z kluczami - skończyło mi się przekazanie zarówno oczekiwanej tablicy, jak i tablicy testowanej przez ksort przed wywołaniem assertEquals. Nie działa to jednak na tablicach rekursywnych.

$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 
1

assertEqual metoda głowa wygląda następująco:

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

Jeśli parametr canonicalize jest ustawiony na true, macierze będzie prowadzony przez sort() pierwsze, jest to użyteczne, gdy klucze są arbitralne i tylko wartości mają znaczenie.

Jednak po przejrzeniu kodu komparatora tablicowego, assertEqual w rzeczywistości nie dba o kolejność skojarzonej tablicy :) Po prostu poszukaj oczekiwanego klucza w tablicy wyników, a następnie porównaj wartości tych kluczy.

-1

Czasami robię to tak:

$arrayResult = [....]; 
$arrayExpected = [....]; 

ksort($arrayResult); // or sort() for associative arrays 
ksort($arrayExpected); 

self::assertSame($arrayExpected, $arrayResult); 
Powiązane problemy