我正在使用SOAP 连接到第三方服务.此服务有时会返回SoapFaults.因为这是预期的,我想通过模拟SoapFaults来测试它.它将返回五种标准的SoapFaults.
这是一个真正的SoapFault的开始:
object(SoapFault)#7 (11) {
["message":protected]=>
string(19) "{ 'INVALID_INPUT' }"
Run Code Online (Sandbox Code Playgroud)
我对此消息感兴趣.在我的代码中,我使用$ e-> getMessage().
catch (SoapFault $e)
{
// Catch any Soap faults and convert to an error message
switch ($e->getMessage())
{
case "{ 'INVALID_INPUT' }":
$this->addError(self::INVALID_INPUT);
return FALSE;
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何模拟SoapClient响应.SoapClient对象似乎没有接受任何输入来设置消息,并且该方法getMessage()是最终的,所以我无法模拟它.
任何想法,将不胜感激.谢谢.
应该没有必要嘲笑SoapFault.您可以使用真正的异常(通常不会因为测试Value objects而模拟异常)并模拟SoapClient以抛出准备好的异常.
通过这样做,您无法模拟,getMessage因为您在测试用例中构建了SoapFault,如下所示.
因为我已经找到了解决你的问题的麻烦,我建立了一个小测试用例,以确保它能够解决问题.因为它已经在那里我猜测代码解释它比我能做得更好.
<?php
class SoapFaultTest extends PHPUnit_Framework_TestCase {
public function testSoapFault() {
$soapFault = new SoapFault("test", "myMessage");
$soapClient = $this->getMockBuilder('SoapClient')
->setMethods(array('methodOnService'))
->disableOriginalConstructor()
->getMock();
$soapClient->expects($this->once())
->method('methodOnService')
->will($this->throwException($soapFault));
$x = new Consumer();
$this->assertSame(
"InvalidInput",
$x->doSoapStuff($soapClient)
);
}
}
class Consumer {
public function doSoapStuff(SoapClient $soapClient) {
try {
$soapClient->methodOnService();
} catch(Exception $e) {
if($e->getMessage() == "myMessage") {
return "InvalidInput";
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
phpunit SoapFaultTest.php
PHPUnit 3.6.3 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.75Mb
OK (1 test, 2 assertions)
Run Code Online (Sandbox Code Playgroud)
断言保持简单,但您应该能够轻松地根据您的错误处理方式进行调整
| 归档时间: |
|
| 查看次数: |
2240 次 |
| 最近记录: |