erlangb
erlangb

Reputation: 533

PhpSpec test catching exception

I have a simple test:

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')));
}

And this one is the code that I want test:

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

The Error handler class it's already tested and will return a class that extends 'Acme\Exception\ErrorResponseException'. The question is, how to mocking a returning Exception from the guzzle Client??

I've tried to use the willTrhow and ThrowPromises of prophecy https://github.com/phpspec/prophecy

What's my error?

I mean, with this code:

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

'runCommand' ( the function tested) it will return the BadResponseException but it's not catched by my code.

Upvotes: 3

Views: 4669

Answers (1)

crmpicco
crmpicco

Reputation: 17181

You could do something like this:

Use the Exception at the top of your spec:

use CRMPicco\Bundle\Exception\ImageImportDirectoryUnavailableException;

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

...and throwing it from you code:

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

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

        // ...

 }

Upvotes: 2

Related Questions