如何在Mockery的模拟方法的第N次调用上抛出异常

时间:2018-06-17 22:05:37

标签: php unit-testing mockery

我需要测试一下我编写的代码在多次调用另一个类的方法时的行为,其中一个调用会引发异常。

我使用Mockery来模拟可能引发异常的类。

所以在我的情况下,该方法将被调用三次,我需要它在第二次抛出异常。

这是我的意图的例子,但它没有用。

$mock = \Mockery::mock();
$mock->shouldReceive('fetch')
    ->andReturnUsing(
        function () {return true;},
        function () use ($e) {throw new \Exception();},
        function () {return false;}
    );

上面的印象可能来自Asserting that mock throws exception · Issue #308 · mockery/mockery中的回复。

但是,实际上,以这种方式抛出异常会导致Mockery捕获异常并抛出自己的BadMethodCall异常。

1 个答案:

答案 0 :(得分:0)

我在Mockery Github问题中找到了答案Mock multiple method call with return and throw

45.6 fl oz
(456 g)

对于那些使用PHPUnit寻找解决方案的人......

$mock = \Mockery::mock();
$mock->shouldReceive('fetch')
    ->andReturnUsing(
        function () use () {
            static $counter = 0;

            switch ($counter++) {
                case 0:
                    return true;
                    break;
                case 1:
                    throw new \Exception();
                    break;
                default:
                    return false;
                    break;
            }
        }
    );

在这种情况下,我觉得PHPUnit模拟提供了比Mockery更好的界面。