phpspec / prophecy

Highly opinionated mocking framework for PHP 5.3+
MIT License
8.53k stars 242 forks source link

When a mocked method throws a `Throwable` the call to the method is not recorded #595

Open BladeMF opened 1 year ago

BladeMF commented 1 year ago

Given this code:

$this->prophesize(Publisher::class)
    ->processChanges($interval)
        ->shouldBeCalled()
        ->willThrow(new TypeError())
        ->getObjectProphecy()
    ->reveal();

when the processChanges method is called, it throws the specified TypeError, but the call is not recorded.

The reason for this are that:

  1. CallCenter catches Exception, not Throwable
  2. Call class requires an ?Exception in the constructor, not Throwable.

IMO it is a perfectly valid assumption that a piece of code can cause a type error. It's not often, but it is a valid case specifically with generated code. I checked that if I just change Exception to Throwable in the two places, it works. Not sure if that breaks some other cases though.