Php 来自本地XML的模拟SoapClient响应

Php 来自本地XML的模拟SoapClient响应,php,soap,mocking,phpunit,Php,Soap,Mocking,Phpunit,我想用文件中的XML模拟\SoapClient的响应 如何创建stdClass对象,就像SoapClient从文件返回一样 客户端已经包装了SoapClient,因此可以轻松地模拟响应 我的模拟是这样的: $soapClient->expects($this->once()) ->method('call') ->will( $this->returnValue(

我想用文件中的XML模拟\SoapClient的响应

如何创建stdClass对象,就像SoapClient从文件返回一样

客户端已经包装了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 hack似乎无法处理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"

您可以按如下方式对SimpleXml进行json编码/解码:

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

但我建议将固定响应明确定义为一个php类。

正如Alex Blex所说,您必须模拟
\uu doRequest

请参阅PHP的源代码:


  • do\u request
    在SoapClient实例上调用“\u doRequest”。然后将其结果传递给解析数据包的soap,然后由soap解析xml。

    我使用了Alex Blex和gaRex建议来模拟doRequest方法。 成功了。我附上示例代码

        $localXml = file_get_contents(__DIR__ . '/localResponse.xml');
        $wsdl = 'https://*******.com/path/to/wsdlV5?WSDL';
    
        $soapClientMock = $this->getMockBuilder(\SoapClient::class)
            ->setConstructorArgs([$wsdl])
            ->setMethods(['__doRequest'])
            ->getMock();
    
        $soapClientMock->expects($this->once())
            ->method('__doRequest')->will($this->returnValue($localXml));
    
        $result = $soapClientMock->__call('Function', []);
    

    试试这个:
    $my_std_class=json_decode(json_encode($my_simplexmlement))它似乎处理的属性与SoapClient答案中的属性不同,我测试了它并添加了结果,我明白了。您将服务器响应放在xml文件中,而不是预期的结果。在这种情况下,你最好模仿这个方法。是的,这可以工作。或者,我将返回的对象序列化为一个文件,并使用unserialize模拟php对象。所有发现都进入这个捆绑包: