2010-05-30 17 views

risposta

19

Sì, sì. assertEquals() and assertNotEquals() documentation.

particolare:

assertEquals()

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

segnala un errore individuato da $message se le due variabili $expected e $actual non sono uguali.

assertNotEquals() è l'inverso di questa asserzione e riprende gli stessi argomenti.

Codice di prova:

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]

Ecco il codice per il fuori aLists ordine:

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

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

Questo test fallisce:

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

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

Con un messaggio:

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

Si tratta di una funzione che richiede gli array a confronto per essere esattamente la stessa chiave ordine per la chiave? –

+0

Domanda interessante ... – Gutzofter

+0

Quindi, se voglio testare un array fuori servizio rispetto a un bene noto, dovrò assicurarmi che i tasti combacino, ma questo è l'unico avvertimento? Grazie per l'aiuto! –

3

@wilmoore

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

fallirà.

@ Ben Dauphinee

Potrebbe essere pena guardare assertContains(mixed $needle, array $haystack) ma si dovrà scorrere entrambi gli array e confrontare ogni elemento con l'altra matrice per assicurare che conteneva tutti gli elementi richiesti e non altre, questo però wouldn 't conto per un array contenente due elementi identici

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

passasse in questo caso

inoltre non spiega ulteriormente ricorsione che probabilmente sarebbe abbastanza complica da trattare.

A seconda della complessità potrebbe essere più semplice a lungo termine implementare la propria funzione di asserzione.

+0

, la tecnica 'array_values' non funzionerà. E 'stato anni fa quando ho postato così non ricordo abbastanza perché questo è stato affermato. –

1

Ho riscontrato questo problema con alcuni array generati con chiavi: ho finito per passare sia l'array previsto che l'array sottoposto a test tramite ksort prima di chiamare assertEquals. Questo però non funziona su array ricorsivi.

$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

Procedimento assertEqual testa aspetto:

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

Se il parametro canonicalize è impostato su true array sarà realizzata tramite sort() prima, questo è utilizzabile se le chiavi sono arbitrari e solo il i valori contano.

Tuttavia, dopo aver esaminato il codice del comparatore di array, allo assertEqual non interessa l'ordine di un array associato :) Sarà semplicemente cercare la chiave prevista nell'array dei risultati e quindi confrontare i valori di tali chiavi.

-1

A volte lo faccio in questo modo:

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

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

self::assertSame($arrayExpected, $arrayResult); 
Problemi correlati