mocking - php:如何在 PhpUnit 测试中模拟 SoapClient 对 __soapCall() 的响应
问题描述
我有一个服务 RessortSoapService,它使用来自 SOAP 调用的响应。
我注入了一个类,它给了我 SoapClient 回来:
public function __construct(ParameterBagInterface $params, SapSoapClientInterface $sapSoapClient)
{
$this->params = $params;
$this->soapClient = $sapSoapClient
->fetchWdslContent($this->params->get('sapwsdlstruktur'))
->getClient();
}
在 SapSoapClient 类中,方法 getClient() 将正确初始化的客户端返回给我:
public function getClient(): SoapClient
{
$client = new SoapClient('data://text/plain;base64,' . base64_encode($this->wsdlContent), $this->options);
return $client;
}
现在我想编写一个单元测试,它当然不应该调用 Soap 服务器,而只是伪造一个响应。
这样做是这样的:
class RessortSoapServiceTest extends TestCase
{
public function setUp(): void
{
$this->prepareMocks();
$this->ressortService = new RessortSoapService($this->params, $this->sapSoapClient);
}
private function prepareMocks()
{
....
$this->soapClient = $this->createMock(SoapClient::class);
$this->soapClient
->method('__soapCall')
->willReturnCallback(
'<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP:Header/>
<SOAP:Body xmlns:urn="urn:sap-com:document:sap:rfc:functions">
<nm:Z_STA_CUST_GET_RESSORTS.Response xmlns:nm="urn:sap-com:document:sap:rfc:functions" xmlns:prx="urn:sap.com:proxy:PV1:/1SAI/TASC3650D2D2360AAAFB21E:731">
<ET_RESSORTS>
<item>
<GROUP_HIER>0000001</GROUP_HIER>
<GROUP>0000001</GROUP>
<IDENT>0000103</IDENT>
<IS_INACTIVE>0</IS_INACTIVE>
</item>
... some more XML
</ET_RESSORTS>
<ET_RETURN>
<item>
<TYPE>S</TYPE>
<ID>ZSTA</ID>
<NUMBER>401</NUMBER>
<MESSAGE>Daten erfolgreich gelesen</MESSAGE>
</item>
</ET_RETURN>
</nm:Z_STA_CUST_GET_RESSORTS.Response>
</SOAP:Body>
</SOAP:Envelope>'
);
$this->sapSoapClient = $this->createMock(SapSoapClientInterface::class);
$this->sapSoapClient
->method('getClient')
->willReturnCallback($this->soapClient);
}
所以我创建了一个本地 SoapClient 的模拟,我告诉他,它应该返回一个包含 SOAP XML 响应的 XML 字符串,而不是真正联系 SoapServer。
当我运行测试时 __soapCall 给我返回 null ,因此我的测试失败。
如何正确模拟我的 __soapCall 响应?这是我第一次使用 Soap,所以也许我错过了一些细节或理解?
解决方案
您正在使用willReturnCallback
. 这期望为实际响应调用一个函数。因此,它会尝试使用整个 xml 的名称来查找函数。它当然不会找到。如果你willReturn
改用,那么你应该得到你想要的结果。
推荐阅读
- java - 从 HashMap 的 Deque 中获取密钥
- scrapy - 为什么即使item pipeline 设置不够,Scrapy 也会执行?
- authentication - 不记名令牌是否需要以特定方式生成
- javascript - jQuery - 那段代码有什么问题?
- html - 没有文本时 W3School 的自定义复选框对齐问题
- javascript - 更新NgModel时视图不更新Angular 6
- node.js - 如何使用 Mongoose 将 NumberDecimal 转换为浮点数?
- hibernate - JPA:保存地图
到餐桌 - c# - 发送电子邮件捕获错误
- html - 列不会与 Bootstrap 水平对齐