2015-03-04 3 views
7

Ecco cosa phpunit dice:phpunit fallisce asserendo che due array sono uguali, ma non mostra alcuna differenza

1) Asgard\Entity\Tests\EntityTest::testToArray 
Failed asserting that two arrays are equal. 
--- Expected 
+++ Actual 
@@ @@ 
Array (
    'id' => null 
    'title' => 'Test Title' 
    'content' => 'Test Content' 
    'published' => 2015-03-04T11:19:50+0000 
    'comments' => Array (
     0 => Array (
      'id' => null 
      'content' => 'foo' 
      'published' => 2015-03-04T11:19:50+0000 
      'another_property' => null 
      'news' => null 
     ) 
     1 => Array (
      'id' => null 
      'content' => 'bar' 
      'published' => 2015-03-04T11:19:50+0000 
      'another_property' => null 
      'news' => null 
     ) 
     2 => Array (
      'id' => null 
      'content' => 'baz' 
      'published' => 2015-03-04T11:19:50+0000 
      'another_property' => null 
      'news' => null 
     ) 
    ) 
    'another_property' => null 
) 

https://travis-ci.org/asgardphp/asgard/jobs/53029084

Non v'è alcuna differenza tra "previsto" e "reale". I test di solito passano, ma a volte fallirebbero su questo.

+0

il test fallisce sempre con php 5.6? – Matteo

+0

Finora sì, l'ho visto solo in mancanza con php 5.6 – leyou

+0

non ho ancora php 5.6. Con 5.5 e 5.3 non riesco a replicare il tuo problema. – Matteo

risposta

1

Dato che stai usando DateTime nei tuoi test - Sei sicuro di non avere un test che inizi in un secondo e finisca in un altro quindi c'è una seconda differenza nei timestamp a seconda di quale fase li guardi ? - L'uso di date e tempi dinamici nei test è una ragione piuttosto comune per i test saltuari occasionali.

+0

L'oggetto datetime viene generato una sola volta e viene utilizzato sia dai risultati effettivi che da quelli previsti. E comunque, anche se questo fosse il problema, phpunit dovrebbe mostrare una differenza tra attesa/effettiva. – leyou

+0

Grazie mille, avrei sprecato ore senza il suggerimento che il tempo poteva causare il problema. Il mio problema era un po 'diverso però, ho usato la conversione predefinita da laravel (Carbon), ha funzionato dopo aver usato un formato diverso (iso8601). – Maaaaa

4

Trovato il problema. Gli elementi non erano nello stesso ordine. Un po 'fastidioso, anche se l'output non lo mostra.

ho sostituito con assertEquals:

$this->assertTrue($this->similar_arrays($arr1, $arr2)); 

protected function similar_arrays($a, $b) { 
    if(is_array($a) && is_array($b)) { 
     if(count(array_diff(array_keys($a), array_keys($b))) > 0) 
      return false; 

     foreach($a as $k => $v) { 
      if(!$this->similar_arrays($v, $b[$k])) 
       return false; 
     } 

     return true; 
    } 
    else 
     return $a === $b; 
} 
0

Verificare se si dispone di EOL nei vostri valori.

Se si dispone di un valore in questo modo:

'x' => 'line1 

line2'

cambiamento a

'x' => "line1\nline2" 

Nota: questo non può rispondere a emissione diretta del PO ha avuto, ma questo è cosa ha funzionato per me