2017-03-27 5 views
0

ich eine Methode zu verspotten versuche, die ein Datetime-Objekt von einem Sollwert an sie übergebenMit Funktion in Spott mit Datetime-Objekten

$mock->shouldReceive('setDatetime') 
      ->with($datetime) 
      ->once; 

Ich bin ziemlich neu in Spott, aber ich verstehe nicht, sollte wie 'mit' funktioniert. Wenn $ datetime das genaue Objekt ist, das an 'setDatetime' übergeben wird, erfüllt es die Bedingung perfekt. Wenn es sich um ein Datetime-Objekt handelt, aber nicht genau dasselbe Objekt, d. H. Alle Werte sind gleich, aber es ist ein anderes instantiiertes DateTime-Objekt, dann funktioniert es nicht. Das Datetime-Objekt, das ich gerade an setDatetime übergebe, wurde mit DateInterval geändert. Kann ich trotzdem testen, ob das empfangene Datetime-Objekt die gleichen Werte hat, auch wenn es nicht das gleiche Objekt ist.

Antwort

0

Dies ist möglich, indem Sie Ihre mit() schließen.

Um die Schließung der mit Funktion geben Mockery Sie eine Schließung Matcher einen Verschluss nehmen gibt

Mockery\Matcher\Closure 

Diese Klasse und es verwenden, um den Wert erhalten Sie anzupassen.

Wie würden Sie implementieren dies so:

$expectedDateTime = new DateTime(); 
$mock->shouldReceive('setDatetime') 
      ->with 
       (new Closure(
       function($datetime) use ($expectedDateTime) { 
        return $datetime->getTimestamp() === $expectedDateTime->getTimeStamp() 
       } 
       ) 
      )->once; 

Der epextedDateTime natürlich ist das Datum, Zeit, dass es sein sollte, aber zum Beispiel Zwecke hier hinzugefügt. Sie können dieses DateTime-Objekt auch im Closure erstellen, wenn Sie es außerhalb der Assertion nicht benötigen. Sie brauchen dann die Verwendung in der Closure nicht.

Und natürlich können Sie prüfen/behaupten, was Sie wollen, in der Schließung als ein Beispiel Ich habe den einfachsten Test der Überprüfung, ob die Zeitstempel gleich sind.

0

Eine andere Lösung wäre die \Hamcrest\Matchers::equalTo. Auf diese Weise setzen Sie den Vergleich explizit auf == (equals) statt === (strict). Sie benötigen dies nur für Objekte, da es bei Primitiven automatisch als Vergleich == vergleicht.

Beispiel:

$mock->shouldReceive('setDatetime') 
    ->with(\Hamcrest\Matchers::equalTo($datetime)) 
    ->once; 

Die Dokumentation schreibt folgendes:

Die häufigste Matcher die mit() Matcher ist:

Erzählt wird Spott, dass er einen Anruf erhalten soll die foo-Methode mit der Ganzzahl 1 als Argument. In solchen Fällen versucht Mostory zunächst, die Argumente mit dem Operator === (identisch) zu vergleichen. Wenn das Argument ein Primitiv ist, und wenn es den identischen Vergleich nicht besteht, macht Mistory einen Fallback auf den Vergleichsoperator == (equals).

Wenn Objekte als Argumente abgeglichen werden, führt Mophery nur den strikten Vergleich === durch, was bedeutet, dass nur das gleiche $ -Objekt übereinstimmt.

Quelle: http://docs.mockery.io/en/latest/reference/argument_validation.html