【发布时间】:2021-02-12 11:05:13
【问题描述】:
有一个使用SoapClient 的自定义验证规则,我现在需要在测试中模拟它。
public function passes( $attribute, $value ): bool
{
$value = str_replace( [ '.', ' ' ], '', $value );
$country = strtoupper( substr( $value, 0, 2 ) );
$vatNumber = substr( $value, 2 );
$client = new SoapClient('https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', [ 'soap_version' => SOAP_1_1 ]);
$response = $client->checkVat( [ 'countryCode' => $country, 'vatNumber' => $vatNumber ] );
return $response->valid;
}
曾经使用laminas-soap包,但不支持PHP8。使用 laminas-soap 可以做到
$this->mock( Client::class, function( $mock )
{
$mock->shouldReceive( 'get' )->andReturn( new Response( true, 200 ) );
} );
但这不适用于SoapClient::class。
然后从Phpunit, mocking SoapClient is problematic (mock magic methods)尝试,但也失败了:
$soapClientMock = $this->getMockFromWsdl('soapApiDescription.wsdl');
$soapClientMock
->method('getAuthenticateServiceSettings')
->willReturn(true);
从mock SoapClient response from local XML 尝试过也失败了:
$soapClient->expects($this->once())
->method('call')
->will(
$this->returnValue(true)
);
我的问题是如何模拟使用 SoapClient 的自定义验证规则的肥皂响应?
【问题讨论】: