抛出错误phpunit的模拟方法

抛出错误phpunit的模拟方法,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,PHPUnit让我创建一个方法存根来抛出异常,使用以下任一方法: [->将($this->throweexception(..)[1] ->willthroweexception(.. 我需要测试一些方法存根抛出PHP错误的情况 PHPUnit是否支持类似的操作?这里有解决方法吗?PHPUnit测试用例类中的throwException()可以将Throwable的任何实例作为参数 这就是说, ->will($this->throwException(new Error()));

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

  • [->将($this->throweexception(..)[1]
  • ->willthroweexception(..
我需要测试一些方法存根抛出PHP错误的情况

PHPUnit是否支持类似的操作?这里有解决方法吗?

PHPUnit测试用例类中的throwException()可以将Throwable的任何实例作为参数

这就是说,

->will($this->throwException(new Error()));
->will($this->throwException(new Exception()));
两者都有效

只会触发一个错误:

$foo
    ->expects($this->once())
    ->method('bar')
    ->willReturnCallback(function () {
        trigger_error(
            'Now really is not a good time',
            E_USER_ERROR
        );
    });
有关参考,请参阅:


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

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

  • 测试方法会产生一些错误,例如警告
  • 该警告是由测试中的set\u error\u处理程序捕获的
  • 在set_error_处理程序的回调函数中,您设置了一些变量,以指示警告已被捕获。(可能是一些静态属性或其他存储)
  • 在测试结束时,您断言静态属性具有特定值=这意味着生成了警告

  • 您可以使测试中的函数抛出异常,如下所示:

    $handlerConsentMessage = $this->getMockBuilder('YourClass')
                ->setMethods(array('yourMethod'))->getMock();
    
    $handlerConsentMessage->method('yourMethod')->willThrowException(new Exception());
    
    $handlerConsentMessage->run('functionToRun');
    

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

    这是什么意思?您可以抛出异常,也可以触发错误。我的语义可能不正确。但是,我想通过存根抛出/触发错误来实现。我自己回答了。请注意,这只适用于PHP 7及以上版本,请参阅。顺便说一下,您可以使用
    willThrowException()
    。不,willThrowException()只能将异常类型作为参数,而不是错误。仅供参考,
    willThrowException()
    方法现在接受PHPUnit 8上的
    \Throwable
    而不仅仅是
    \Exception
    (至少8.2,没有在早期版本上尝试过)@NikhilKuriakose:如果这回答了问题,请将其标记为“答案”。很好,现在它变得有趣了。我假设这两种行为(你的答案和我的答案)将给出完全相同的输出?哈,你的肯定更好,在PHP7上更有意义。还没有必要模拟触发错误(而不是抛出异常),所以我没有真正使用我之前在这里建议的内容。但是,这很好。我搜索了数小时的答案,突然我有了两个:)谢谢!!!很高兴你喜欢它!经常问别人是有意义的,呵呵!谢谢,但我正在开发一个库,它可能会有来自客户端的未处理异常/抛出错误。好的,那么要处理任何类型的错误,可以使用@expectedException PHPUnit\Framework\Error annotation()或者,如果您对检测生成的错误感兴趣,那么设置错误处理程序总是有帮助的