Wie kann vermieden werden, dass phpunit den Konstruktor für ein Scheinobjekt aufrufen muss? Andernfalls würde ich ein Scheinobjekt als Konstruktorargument benötigen, ein anderes dafür usw. Die API scheint so zu sein:
getMock($className, $methods = array(), array $arguments = array(),
$mockClassName = '', $callOriginalConstructor = TRUE,
$callOriginalClone = TRUE, $callAutoload = TRUE)
Ich bekomme es nicht zum Laufen. Es beschwert sich immer noch über das Konstruktorargument, selbst wenn $callOriginalConstructor
es auf false gesetzt ist.
Ich habe nur ein Objekt im Konstruktor und es ist eine Abhängigkeitsinjektion. Ich glaube also nicht, dass ich dort ein Designproblem habe.
quelle
Bitte schön:
quelle
Als Ergänzung wollte ich
expects()
Aufrufe an mein verspottetes Objekt anhängen und dann den Konstruktor aufrufen. In PHPUnit 3.7.14 ist das Objekt, das beim Aufruf zurückgegebendisableOriginalConstructor()
wird, buchstäblich ein Objekt.Leider gibt es in PHP 5.4 eine neue Option, die sie nicht verwenden:
ReflectionClass :: newInstanceWithoutConstructor
Da dies nicht verfügbar war, musste ich die Klasse manuell widerspiegeln und dann den Konstruktor aufrufen.
Beachten Sie , wenn
functionCallFromConstruct
istprotected
, müssen Sie speziell verwenden ,setMethods()
so dass die geschützte Methode verspottet wird. Beispiel:setMethods()
muss vor demexpect()
Anruf angerufen werden. Persönlich verkette ich das nach,disableOriginalConstructor()
aber vorhergetMock()
.quelle
Möglicherweise müssen Sie einen Stub erstellen, der als Konstruktorargument übergeben wird. Dann können Sie diese Kette von Scheinobjekten durchbrechen.
quelle
Alternativ können Sie getMock einen Parameter hinzufügen , um den Aufruf des Standardkonstruktors zu verhindern.
Trotzdem denke ich, dass die Antwort von dave1010 besser aussieht, nur der Vollständigkeit halber.
quelle
Diese Frage ist etwas alt, aber für neue Besucher können Sie sie mit der
createMock
MethodecreateTestDouble
ausführen (die zuvor in Version 5.4.0 aufgerufen und eingeführt wurde).Wie Sie im folgenden Code sehen können, der aus der
PHPUnit\Framework\TestCase
Klasse (inphpunit/src/framework/TestCase.php
) extrahiert wurde , wird im Grunde genommen ein Scheinobjekt erstellt, ohne den ursprünglichen Konstruktor aufzurufen .quelle
PHPUnit dient zum Aufrufen des Konstruktors für verspottete Objekte. Um dies zu verhindern, sollten Sie entweder:
quelle