2016-04-04 3 views
3

Ich möchte die Antwort von einem \ SoapClient mit XML aus einer Datei spotten.Mock SoapClient Antwort von lokalen XML

Wie kann ich ein stdClass-Objekt erstellen, wie der SoapClient aus einer Datei zurückgibt.

Der Client umschließt bereits den SoapClient, sodass die Antwort leicht gespiegelt werden kann.

Meine Mock ist wie folgt:

$soapClient->expects($this->once()) 
      ->method('call') 
      ->will(
       $this->returnValue(
        simplexml_load_string(
         file_get_contents(__DIR__ . '/../../../Resources/file.xml') 
        ) 
       ) 
      ); 

Aber das gibt SimpleXML und nicht stdClass.

Update:
Die vorgeschlagene json_encode/json_decode Hack scheint nicht Attribute zu handhaben als die Soapclient sie zurück:

Soapclient:

object(stdClass)[4571] 
    public 'Lang' => string 'de' (length=2) 
    public 'Success' => boolean true 

Hack:

object(stdClass)#27 (3) { 
    ["@attributes"]=> 
    object(stdClass)#30 (2) { 
    ["Lang"]=> 
    string(2) "de" 
    ["Success"]=> 
    string(4) "true" 
+0

try this: '$ my_std_class = json_decode (json_encode ($ my_simplexmlelement));' – Matteo

Antwort

2

Sie kann json codieren/decodieren SimpleXml wie folgt:

$soapClient->expects($this->once()) 
     ->method('call') 
     ->will(
      $this->returnValue(
       json_decode(json_encode(
        simplexml_load_string(
         file_get_contents(__DIR__ . '/../../../Resources/file.xml') 
        ) 
       )) 
      ) 
     ); 

Aber ich würde empfehlen, die vordefinierte Antwort explizit als PHP-Klasse zu definieren.

+0

, die die gleichen Attribute wie in den SoapClients beantworten zu behandeln scheinen tut, ich getestet es und hinzugefügt, um die Ergebnisse – ivoba

+0

Ah, sehe ich. Sie haben die Serverantwort auf die XML-Datei gesetzt, nicht das erwartete Ergebnis. In diesem Fall sollten Sie besser die Methode '' SoapClient :: __ doRequest' '(http://php.net/manual/en/soapclient.dorequest.php) vortäuschen. –

+0

ja das könnte funktionieren. Oder ich serialisiert das zurückgegebene Objekt in eine Datei und mokiere das PHP-Objekt mit unserem – ivoba