2015-03-04 4 views
7

Hier ist, was phpunit sagt:phpunit nicht behaupten, daß zwei Arrays gleich sind, aber zeigt keinen Unterschied

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

Es gibt keinen Unterschied zwischen „erwartet“ und „Ist“. Die Tests sind in der Regel erfolgreich, würden aber manchmal scheitern.

+0

der Test fehlgeschlagen immer mit PHP 5.6? – Matteo

+0

Bisher ja, ich habe es nur mit php 5.6 – leyou

+0

scheitern gesehen habe ich noch nicht php 5.6. Mit 5.5 und 5.3 kann ich Ihr Problem nicht replizieren. – Matteo

Antwort

1

Da Sie DateTime in Ihren Tests verwenden - Sind Sie sicher, dass Sie keine Tests erhalten, die in einer Sekunde beginnen und in einer anderen enden, so gibt es einen zweiten Unterschied in den Zeitstempeln, je nachdem, auf welcher Stufe Sie sie betrachten ? - Die Verwendung dynamischer Daten und Zeiten in Tests ist ein häufiger Grund für gelegentliche fehlgeschlagene Tests.

+0

Das datetime Objekt wird nur einmal erzeugt und wird sowohl vom tatsächlichen als auch vom erwarteten Ergebnis verwendet. Und auch wenn dies das Problem war, sollte phpunit einen Unterschied zwischen erwartet/tatsächlich zeigen. – leyou

+0

Vielen Dank, ich hätte Stunden ohne den Hinweis vergeudet, dass das Datum das Problem verursachen könnte. Mein Problem war ein bisschen anders, obwohl ich die Standardkonvertierung von Laravel (Carbon) verwendet habe, funktionierte es nach der Verwendung eines anderen Formats (iso8601). – Maaaaa

4

Das Problem gefunden. Elemente waren nicht in der gleichen Reihenfolge. Ein bisschen nervig aber, dass die Ausgabe es nicht zeigt.

Ich habe ersetzt assertEquals mit:

$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

Überprüfen Sie, ob Sie EOL in Ihre Werte haben.

Wenn Sie einen Wert wie so:

'x' => 'line1 

line2'

Änderung es

'x' => "line1\nline2" 

Hinweis: Dies kann nicht direkt Thema beantworten die OP hatte, aber das ist was für mich funktioniert hat.

Verwandte Themen