模拟抛出错误phpunit的方法

时间:2017-08-27 12:57:51

标签: php unit-testing phpunit

PHPUnit让我使用以下任一方法创建一个方法存根来抛出异常:

  • [->will($this->throwException(..)][1]
  • ->willThrowException(..

我需要测试方法存根抛出PHP错误的一些情况。

PHPUnit是否支持这样的东西?这里有变通方法吗?

4 个答案:

答案 0 :(得分:5)

PHPUnit TestCase类中的throwException()可以将Throwable的任何实例作为参数。

这意味着,

->will($this->throwException(new Error()));
->will($this->throwException(new Exception()));

都有效

答案 1 :(得分:2)

只是触发错误:

$foo
    ->expects($this->once())
    ->method('bar')
    ->willReturnCallback(function () {
        trigger_error(
            'Now really is not a good time',
            E_USER_ERROR
        );
    });

供参考,见:

答案 2 :(得分:2)

你可以在测试中使函数抛出异常,如下所示:

$handlerConsentMessage = $this->getMockBuilder('YourClass')
            ->setMethods(array('yourMethod'))->getMock();

$handlerConsentMessage->method('yourMethod')->willThrowException(new Exception());

$handlerConsentMessage->run('functionToRun');

现在当你运行测试函数functionToRun时,如果调用了函数YourMethod,它将抛出异常。

答案 3 :(得分:-1)

高质量代码在正常工作期间不会产生任何PHP错误(通知,警告,致命错误,解析错误)。如果它仍然产生错误 - 您应该尝试检测此类边缘情况并抛出异常/返回不同的结果。然后,这些异常在PHPUnit测试中很容易被模拟。

其他解决方法,如果无法修改测试类,则是在测试中定义错误侦听器,请参阅set_error_handler。逻辑应遵循:

  1. 经过测试的方法会产生一些错误,例如警告
  2. 警告在测试中被set_error_handler捕获。
  3. 在set_error_handler的回调中设置一些变量,表示警告是catch。 (它可能是一些静态属性,或另一个存储)
  4. 在测试结束时,断言静态属性具有特定值=它表示已生成警告。