PHPUnit und Mock-Objekten nicht funktioniert
Ich bin nicht sicher, wenn ich mache etwas falsch oder es ist ein Fehler mit PHPUnit und mock-Objekte. Grundsätzlich bin ich versucht zu testen, ob $Model->doSomething()
wird aufgerufen, wenn $Model->start()
ausgelöst wird.
Ich bin mit Ubuntu in einer VirtualBox, und phpunit 1.1.1 installiert es über pear.
Den vollständigen code weiter unten. Jede Hilfe würde geschätzt, es treibt mich verrückt.
<?php
require_once 'PHPUnit/Autoload.php';
class Model
{
function doSomething( ) {
echo 'Hello World';
}
function doNothing( ) { }
function start( ) {
$this->doNothing();
$this->doSomething();
}
}
class ModelTest extends PHPUnit_Framework_TestCase
{
function testDoSomething( )
{
$Model = $this->getMock('Model');
$Model->expects($this->once())->method('start'); # This works
$Model->expects($this->once())->method('doSomething'); # This does not work
$Model->start();
}
}
?>
Die Ausgabe von PHPUnit:
There was 1 failure:
1) ModelTest::testDoSomething
Expectation failed for method name is equal to <string:doSomething> when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
- Ich habe es funktioniert, aber ich musste der Methoden als array.
code
$Model = $this->getMock('Modell',array('doSomething','doNothing')); #$Model->erwartet, dass($this->once())->Methode('start'); # Das funktioniert - Weiß jemand, warum müssen Sie die Methoden. Ist dies ein Konfigurationsproblem. Viele Beispiele für die Verwendung von mocks nicht Zustand, die Sie haben, um anzugeben, Methoden.
- Hast du wirklich meinst, phpUnit 1.1.1? Die Letzte ist 3,7, und die frühesten, die Sie wahrscheinlich zu begegnen, die in einem unterstützten linux-Distribution phpUnit 3.4 oder so.
- Tut mir Leid mein schlechtes, nicht sicher, wo ich die 1.1.1 aus, ich bin mit der version 3.6.12. Vielen Dank an alle für Eure Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie gefunden wird, müssen Sie sagen, PHPUnit, welche Methoden zu verspotten. Auch würde ich vermeiden, erstellen Erwartungen für die Methoden, die Sie anrufen, direkt aus dem test. Ich würde schreiben Sie den obigen test so:
Nur zu erweitern, warum David Harkness Antwort funktioniert, wenn Sie nicht angeben der Methoden $parameter
getMock
dann alle Funktionen in der Klasse verspottet. Man kann übrigens bestätigen Sie diese mit:So, warum scheitert es? Weil Ihr
start()
Funktion wurde verspottet zu! I. e. der Hauptteil der Funktion, die Sie gegeben haben, wurden ersetzt, und so Ihre$this->doSomething();
Zeile wird nie ausgeführt.Daher, wenn es irgendwelche Funktionen in Ihrer Klasse, dass Sie erhalten werden müssen, müssen Sie ausdrücklich in der Liste der alle anderen Funktionen.