Php 来自本地XML的模拟SoapClient响应
我想用文件中的XML模拟\SoapClient的响应 如何创建stdClass对象,就像SoapClient从文件返回一样 客户端已经包装了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(
$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对象。所有发现都进入这个捆绑包: