2010-05-30 10 views
18

Einige der Tests, die ich durchführen muss, erfordern einen Vergleich eines bekannten Arrays mit dem Ergebnis, das ich von den Funktionen erhalte, die ich ausführen werde.Hat PHPUnit eine eingebaute rekursive Array Vergleichsfunktion?

Für Arrays rekursiv Vergleich:

  • Does PHPUnit haben eine eingebaute Funktion?
  • Hat jemand hier einen Code, den er konstruiert hat, um ihn zu teilen?
  • Wird das etwas sein, das ich selbst konstruieren muss?

Antwort

19

Ja, tut es. assertEquals() and assertNotEquals() documentation.

Einzelnen:

assertEquals()

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

Meldet einen durch $message identifizierten Fehler, wenn die beiden Variablen $expected und $actual nicht gleich sind.

assertNotEquals() ist die Umkehrung dieser Behauptung und nimmt die gleichen Argumente.

Testcode:

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]

Hier ist der Code für die aus der Ordnung Alists:

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

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

Dieser Test schlägt fehl:

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

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

mit:

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

Ist dies eine Funktion, die die Arrays für Schlüssel in genau der gleichen Reihenfolge Schlüssel zu sein, erfordert im Vergleich? –

+0

Interessante Frage ... – Gutzofter

+0

Also, wenn ich eine Out-of-Order-Array gegen eine bekannte gut testen will, muss ich sicherstellen, dass die Schlüssel übereinstimmen, aber das ist der einzige Vorbehalt? Danke für die Hilfe! –

3

@wilmoore

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

fehl.

@ Ben Dauphinee

Es könnte bei assertContains(mixed $needle, array $haystack) suchen wert sein, aber man würde eine Schleife durch beide Arrays und jedes Element mit dem anderen Array zu vergleichen, um es alle erforderlichen Elemente zu gewährleisten enthalten und keine anderen, dies jedoch wouldn ‚t-Account für ein Array mit zwei identischen Elementen

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

in diesem Fall passieren würde

Es ist auch nicht für jede weitere Rekursion zu berücksichtigen, die wahrscheinlich ziemlich complica wäre zu bewältigen.

Je nach Komplexität könnte es auf lange Sicht einfach einfacher sein, eine eigene Assert-Funktion zu implementieren.

+0

In der Tat wird die 'array_values' Technik nicht funktionieren. Es ist Jahre her, als ich gepostet habe, also weiß ich nicht recht, warum das behauptet wurde. –

1

Ich hatte dieses Problem mit einigen generierten Arrays mit Schlüsseln - ich übergab sowohl das erwartete Array als auch das getestete Array durch ksort vor dem Aufruf von assertEquals. Dies funktioniert jedoch nicht für rekursive Arrays.

$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

Die assertEqual Methode Kopf sieht wie folgt aus:

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

Wenn der canonicalize Parameter auf true gesetzt ist die Arrays werden durch sort() zuerst ausgeführt werden, das verwendet werden kann, wenn die Schlüssel willkürlich sind und nur die Werte sind wichtig.

Aber nach dem Blick auf den Array-Komparator-Code, die assertEqual ist eigentlich egal, um die Reihenfolge eines zugeordneten Array :) Es wird einfach nach dem erwarteten Schlüssel im Ergebnis-Array suchen und vergleichen Sie dann die Werte dieser Schlüssel.

-1

Irgendwann mache ich es wie folgt aus:

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

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

self::assertSame($arrayExpected, $arrayResult); 
Verwandte Themen