Исключение для проверки PhpSpec

У меня есть простой тест:

function it_should_return_error_response_exception(Client $httpClient,CommandInterface $commandInterface)
{
    $httpClient->setDefaultOption('auth', array('api','api_pass', 'Basic'))
        ->shouldBeCalled();

    $httpClient->getCommand('search', array('api_key' => 'ehudwqukhjda'))
        ->shouldBeCalled()
        ->willReturn($commandInterface);

    $httpClient->execute($commandInterface)
        ->shouldBeCalled()
        ->willThrow(new BadResponseException('???', new Request('POST', 'http://vatteloapesca')));


    $this->shouldThrow('Acme\Exception\ErrorResponseException')
        ->during('runCommand', array('search', array('api_key' => 'ehudwqukhjda')));
}

И это код, который я хочу протестировать:

  try{
        $result = $this->guzzleClient->execute($command);
    } catch (BadResponseException $e) {
        ErrorHandler::processError($e);
    }
    return $result;

Класс обработчика ошибок уже протестирован и вернет класс, расширяющий «Acme\Exception\ErrorResponseException». Вопрос в том, как издеваться над возвращающимся Exception от клиента жрать??

Я пытался использовать willTrhow и ThrowPromises пророчества https://github.com/phpspec/prophecy.

В чем моя ошибка?

Я имею в виду, с этим кодом:

 $httpClient->execute($commandInterface)
        ->shouldBeCalled()
        ->willThrow(new BadResponseException('???', new Request('POST', 'http://vatteloapesca')));

'runCommand' (проверенная функция) вернет исключение BadResponseException, но оно не перехватывается моим кодом.


person erlangb    schedule 14.07.2014    source источник


Ответы (1)


Вы можете сделать что-то вроде этого:

Используйте исключение в верхней части спецификации:

use CRMPicco\Bundle\Exception\ImageImportDirectoryUnavailableException;

$this->shouldThrow(ImageImportDirectoryUnavailableException::class)
->during('importImageAssets', [$imageImportPath]);

... и выбросив его из вашего кода:

 public function importImageAssets($importDirectory)
 {
        $filesystem = new Filesystem();

        if (false === $filesystem->exists($importDirectory)) {
            throw new ImportDirectoryUnavailableException();
        }

        // ...

 }
person crmpicco    schedule 03.03.2016
comment
@MeuhMeuh Когда вы пишете тесты для своего кода, они могут выявить недостатки в дизайне кода. - person crmpicco; 22.03.2016
comment
@MeuhMeuh, который вы тестируете, должен контролировать ваш код. Это ТДД. Вы пишете тест, а затем код. - person mmrs151; 21.03.2018