24

I am trying to mock an object that gets two calls to the same function but with different arguments. It's pretty straight forward to give back different return values for multiple calls but I can't find anywhere how to do it with the argument validation.

I tried:

$this->eventDispatcher
    ->shouldReceive('dispatch')
    ->twice()
    ->with(Events::SELECT,\Mockery::type('\Not\Really\A\Namespace\Event'))
    ->with(Events::ACTIVITY,\Mockery::type('\Not\Really\A\Namespace\Event');

And

$this->eventDispatcher
        ->shouldReceive('dispatch')
        ->twice()
        ->with(
            [Events::SELECT,\Mockery::type('\Not\Really\A\Namespace\Event')],
            [Events::ACTIVITY,\Mockery::type('\Not\Really\A\Namespace\Event')]
        );

But they don't work.

From the output PHPUnit gives me it seems like I'm getting an array?

Tim Strijdhorst
  • 1,539
  • 3
  • 14
  • 29

1 Answers1

31

Well that was fast ;P Apparently you can do this and it works just fine:

$this->eventDispatcher
    ->shouldReceive('dispatch')
    ->with(Events::SELECT,\Mockery::type('\Not\Really\A\Namespace\Event'));

$this->eventDispatcher
    ->shouldReceive('dispatch')
    ->with(Events::ACTIVITY,\Mockery::type('\Not\Really\A\Namespace\Event'); 
Tim Strijdhorst
  • 1,539
  • 3
  • 14
  • 29
  • 2
    I found that you have to add `once()` after each `shouldReceive()` otherwise the test will not fail if the method is not called at all. I also had to add another `shouldReceive()->never()` at the end to not allow further calls. Feels a bit hacky - but seems to work. – Michael Härtl Apr 13 '22 at 13:22