我需要测试一下我编写的代码在多次调用另一个类的方法时的行为,其中一个调用会引发异常。
我使用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
异常。
答案 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更好的界面。