Не надо издеваться над 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";
}
}
}
}
Выходы:
phpunit SoapFaultTest.php
PHPUnit 3.6.3 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.75Mb
OK (1 test, 2 assertions)
Утверждение остается простым, но вы легко сможете адаптировать его к своему способу обработки ошибок