11 Stimmen

Wie kann man einen Webdienst in PHPUnit über mehrere Tests hinweg als Mocktest verwenden?

Ich versuche, eine Web-Service-Schnittstelle-Klasse mit PHPUnit zu testen. Grundsätzlich macht diese Klasse Aufrufe an eine SoapClient Gegenstand. Ich versuche, diese Klasse in PHPUnit zu testen, indem ich die getMockFromWsdl hier beschriebenen Methode:

http://www.phpunit.de/manual/current/en/test-doubles.html#test-doubles.stubbing-and-mocking-web-services

Da ich jedoch mehrere Methoden derselben Klasse testen möchte, muss ich jedes Mal, wenn ich das Objekt einrichte, auch die Mock-WSDL einrichten SoapClient Objekt. Dies führt zu einem schwerwiegenden Fehler, der ausgelöst wird:

Fatal error: Cannot redeclare class xxxx in C:\web\php5\PEAR\PHPUnit\Framework\TestCase.php(1227) : eval()'d code on line 15

Wie kann ich ein und dasselbe Mock-Objekt in mehreren Tests verwenden, ohne es jedes Mal aus der WSDL neu generieren zu müssen? Das scheint das Problem zu sein.

--

Nachdem ich gebeten wurde, etwas Code zu posten, den ich mir ansehen kann, hier die Setup-Methode in der TestCase:

protected function setUp() {
    parent::setUp();

    $this->client = new Client();

    $this->SoapClient = $this->getMockFromWsdl(
        'service.wsdl'
    );

    $this->client->setClient($this->SoapClient);
}

-1voto

Mandos78 Punkte 1

PHPUnit erstellt eine Klasse für den Mock auf der Grundlage der WSDL. Der Klassenname, falls nicht angegeben, wird aus dem .wsdl-Dateinamen konstruiert, ist also immer derselbe. Bei allen Tests stürzt es ab, wenn es versucht, die Klasse erneut zu erstellen.

Das Einzige, was Sie tun müssen, ist, der Mock-Definition einen eigenen Klassennamen hinzuzufügen, damit PHPUnit nicht automatisch einen Namen erstellt, beachten Sie das zweite Argument von $this->getMockFromWsdl:

protected function setUp() {
   parent::setUp();

   $this->client = new Client();

   $this->SoapClient = $this->getMockFromWsdl(
      'service.wsdl', 'MyMockClass'
   );

   $this->client->setClient($this->SoapClient);
}

Sie können nun so viele Clients erstellen, wie Sie möchten, und nur den Klassennamen für jeden einzelnen ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X