2016-04-04 3 views
3

\ SoapClientの応答をファイルからXMLで嘲笑したい。ローカルXMLのSoapClient応答を模倣する

SoapClientがファイルから返すのと同じように、stdClassオブジェクトを作成するにはどうすればよいですか。

クライアントは既にSoapClientをラップしているので、簡単に応答を模擬することができます。

私のモックは、このようなものです:

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

しかし、これはSimpleXMLをしていないはstdClassを返します。

更新:
提案json_encode/json_decodeハックのdoesntのSoapClientがそれらを返すなどの属性を処理するように見える:

のSoapClient:

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

ハック:

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

この試してください: '$ my_std_class = json_decode(json_encode($のmy_simplexmlelementを));' – Matteo

答えて

2

あなたにjsonは次のようにSimpleXmlをエンコード/デコードできます:

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

しかし、私はcanned responseをPHPクラスとして明示的に定義することをお勧めします。

+0

SoapClientsと同じで答える属性を処理するように見えるdoesntのこと、私は私が見る、それをテストし、結果 – ivoba

+0

ああを追加しました。予想される結果ではなく、サーバー応答をXMLファイルに置きます。この場合は、['SoapClient :: __ doRequest'](http://php.net/manual/en/soapclient.dorequest.php)メソッドをモックしてください。 –

+0

これはうまくいく可能性があります。または返されたオブジェクトをファイルにシリアライズし、unserializeでPHPオブジェクトをモックします。 – ivoba

関連する問題