Sind Sie es leid, sich an den Unterschied zwischen Mocks, Partials und Spiones in Mockery zu erinnern? Das bin ich, weshalb ich double()
erstellt habe – eine einfache Hilfsmethode, die die Verwendung von Mockery einfacher macht.
Beim Schreiben von Tests möchte ich nicht über die Unterschiede zwischen Fakes , Mocks und Spys nachdenken. Ich möchte nur ein generisches Testdoppel erstellen und mich auf das Schreiben meines Tests konzentrieren. Diese Verallgemeinerung ist in anderen Test-Frameworks wie RSpec, td.js und anderen üblich.
Um die neueste Version des double()
Helfers zu installieren, führen Sie den folgenden Befehl aus:
composer require --dev jasonmccreary/test-double
Wenn Sie ein Test-Double erstellen müssen, rufen Sie einfach double()
auf.
Standardmäßig gibt double()
ein Objekt zurück, mit dem Sie Methoden stummschalten und Methodenaufrufe überprüfen können.
<?php
$ td = double ();
$ td -> shouldReceive ( ' someMethod ' )-> andReturn ( 5 );
$ td -> someMethod (); // returns 5
$ td -> unstubbedMethod (); // returns null, does not throw an exception
$ td -> anotherMethod ();
$ td -> shouldHaveReceived ( ' anotherMethod ' );
In Mockery entspricht dieses Testdouble Mockery::mock()->shouldIgnoreMissing()
oder, in neueren Versionen, Mockery::spy()
.
Sie können double()
auch einen Verweis auf eine Klasse oder Schnittstelle übergeben. Dadurch wird ein Testobjekt erstellt, das die Klasse erweitert oder die Schnittstelle implementiert. Dadurch kann das Double alle Typhinweise oder Typprüfungen in Ihrer Implementierung übergeben.
<?php
$ td = double (Str::class);
$ td -> shouldReceive ( ' length ' )-> andReturn ( 5 );
$ td -> length (); // 5
$ td -> substr ( 1 , 3 ); // null
$ td instanceof Str; // true
$ td -> shouldHaveReceived ( ' substr ' )-> with ( 1 , 3 );
Schließlich akzeptiert double()
ein zweites Argument von passhru . Passthru ist standardmäßig false
. Wenn es auf true
gesetzt ist, leitet das Testobjekt alle Methodenaufrufe an das zugrunde liegende Objekt weiter.
In Mockery entspricht dies Mockery::mock(Number::class)->shouldDeferMissing()
.
<?php
class Number
{
public function one ()
{
return 1 ;
}
public function random ()
{
return 5 ;
}
}
$ td = double (Number::class, true );
$ td -> shouldReceive ( ' random ' )-> andReturn ( 21 );
$ td -> random (); // 21
$ td -> one (); // 1
$ td instanceof Number; // true
$ td -> shouldHaveReceived ( ' one ' );
Hinweis: Passthru kann nur verwendet werden, wenn ein Test-Double mit einer Klassenreferenz erstellt wird, da dies das einzige Mal ist, dass eine zugrunde liegende Implementierung vorhanden ist.
Letztendlich ist double()
eine eigenwillige Möglichkeit, Testobjekte für Ihren zugrunde liegenden Code zu erstellen. Wenn es Ihren Anforderungen nicht entspricht, können Sie jederzeit direkt ein Mockery::mock()
erstellen. Dies ist jedoch wahrscheinlich der Eindruck, dass Sie Ihre Implementierung auf eine Weise testen, die nicht das Verhalten in der realen Welt widerspiegelt. Denken Sie daran, double()
ein Objekt zurückgibt, das MockeryInterface
implementiert. Es kann also wie jedes andere Mockery::mock()
-Objekt behandelt werden.