Phpunit,嘲笑SoapClient是有问题的(模拟魔术方法)

Pat*_*all 9 php phpunit soap wsdl web-services

我试图用以下代码模拟SoapClient:

$soapClientMock = $this->getMockBuilder('SoapClient')
                ->disableOriginalConstructor()
                ->getMock();
$soapClientMock->method('getAuthenticateServiceSettings')
        ->willReturn(true);
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为Phpunit mockbuilder没有找到函数getAuthenticateServiceSettings.这是WSDL中指定的Soap函数.

但是,如果我扩展SoapClient类和getAuthenticateServiceSettings方法,它确实有效.

问题是我有100个SOAP调用,都有自己的参数等所以我不想模拟每个SOAP函数,或多或少地重新创建整个WSDL文件...

有没有办法模仿"魔法"方法?

use*_*136 20

PHPUnit允许您基于wsdl文件存根Web服务.

$soapClientMock = $this->getMockFromWsdl('soapApiDescription.wsdl');
$soapClientMock
    ->method('getAuthenticateServiceSettings')
    ->willReturn(true);
Run Code Online (Sandbox Code Playgroud)

见这里的例子:

https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.stubbing-and-mocking-web-services.examples.GoogleTest.php


zuz*_*nen 5

我通常不直接使用\ SoapClient类,而是使用使用SoapClient的Client类.例如:

class Client
{
    /**
     * @var SoapClient 
     */
    protected $soapClient;

    public function __construct(SoapClient $soapClient)
    {
        $this->soapClient = $soapClient;
    }

    public function getAuthenticateServiceSettings()
    {
        return $this->soapClient->getAuthenticateServiceSettings();
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式比模拟SoapClient更容易模拟Client类.

  • 那么当您需要为这个 Client 类进行单元测试时会发生什么? (5认同)