Phpunit - 模拟SoapFault-> getMessage()

Ain*_*ine 1 php phpunit soap

我正在使用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()是最终的,所以我无法模拟它.

任何想法,将不胜感激.谢谢.

edo*_*ian 5

应该没有必要嘲笑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)

断言保持简单,但您应该能够轻松地根据您的错误处理方式进行调整