soapcall - Phpunit, burlarse de SoapClient es problemático(métodos mágicos falsos)
soapclient php parameters (3)
Estoy tratando de burlar SoapClient con el siguiente código:
$soapClientMock = $this->getMockBuilder(''SoapClient'')
->disableOriginalConstructor()
->getMock();
$soapClientMock->method(''getAuthenticateServiceSettings'')
->willReturn(true);
Esto no funcionará, ya que Phpunit mockbuilder no encuentra la función getAuthenticateServiceSettings. Esta es una función de Soap especificada en el WSDL.
Sin embargo, si extiendo la clase SoapClient y el método getAuthenticateServiceSettings, funciona.
El problema es que tengo cientos de llamadas SOAP, todas con sus propios parámetros, etc., así que no quiero burlarme de cada función SOAP y recrear más o menos todo el archivo WSDL ...
¿Hay alguna manera de burlarse de los métodos "mágicos"?
Por lo general, no trabajo directamente con la clase / SoapClient, sino que utilizo una clase Client que usa SoapClient. Por ejemplo:
class Client
{
/**
* @var SoapClient
*/
protected $soapClient;
public function __construct(SoapClient $soapClient)
{
$this->soapClient = $soapClient;
}
public function getAuthenticateServiceSettings()
{
return $this->soapClient->getAuthenticateServiceSettings();
}
}
De esta manera es más fácil burlarse de la clase Client, que burlarse de SoapClient.
PHPUnit le permite crear un servicio web basado en un archivo wsdl.
$soapClientMock = $this->getMockFromWsdl(''soapApiDescription.wsdl'');
$soapClientMock
->method(''getAuthenticateServiceSettings'')
->willReturn(true);
Vea el ejemplo aquí:
No pude usar getMockFromWsdl
para un escenario de prueba, así que me __call
método __call
que se llama en segundo plano:
$soapClient = $this->getMockBuilder(SoapClient::class)
->disableOriginalConstructor()
->getMock();
$soapClient->expects($this->any())
->method(''__call'')
->willReturnCallback(function ($methodName) {
if (''methodFoo'' === $methodName) {
return ''Foo'';
}
if (''methodBar'' === $methodName) {
return ''Bar'';
}
return null;
});
PD: Intenté usar __soapCall
primero porque __call
está en desuso, pero eso no funcionó.