【问题标题】:Mocking methods to throw Error phpunit抛出错误phpunit的模拟方法
【发布时间】:2018-02-04 21:47:21
【问题描述】:

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

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

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

PHPUnit 是否支持这样的东西?这里有什么解决方法吗?

【问题讨论】:

  • 你这是什么意思?您可以抛出异常,也可以触发错误。
  • 我的语义可能不正确。但是,我想通过存根抛出/触发错误。我自己回答了。
  • 请注意,这仅适用于 PHP 7 及更高版本,请参阅php.net/manual/en/language.errors.php7.php

标签: php unit-testing phpunit


【解决方案1】:

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

这意味着,

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

都是有效的

【讨论】:

  • 对了,你可以用willThrowException()代替。
  • 不行,willThrowException() 只能将异常类型作为参数,而不是错误。
  • 仅供参考,willThrowException() 方法现在在 PHPUnit 8 上接受 \Throwable 而不仅仅是 \Exception(至少 8.2,未在早期版本上尝试过)
  • @NikhilKuriakose:如果这回答了问题,请将其标记为“答案”。
【解决方案2】:

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

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

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

$handlerConsentMessage->run('functionToRun');

现在,当您运行测试函数 functionToRun 时,如果曾调用过 YourMethod 函数,它将引发异常。

【讨论】:

    【解决方案3】:

    只要触发一个错误:

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

    参考见:

    【讨论】:

    • 很好,现在变得有趣了。我假设两种行为(你的答案和我的)都会给出完全相同的输出?
    • 哈,你的肯定更好,在 PHP7 上更有意义。还没有需要模拟触发错误(而不是抛出异常),所以我还没有真正使用我之前在这里建议的内容。
    • 但是,这很好。我找了几个小时的答案,突然我有两个:) 谢谢!!!
    • 很高兴你喜欢它!经常问别人是有道理的,呵呵!
    【解决方案4】:

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

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

    1. 经过测试的方法会产生一些错误,例如警告
    2. 警告被您的测试中的 set_error_handler 捕获。
    3. 在 set_error_handler 的回调中,您设置了一些变量,以表明警告已被捕获。 (可能是一些静态属性,或者其他存储)
    4. 在测试结束时,您断言静态属性具有特定值 = 这意味着生成了警告。

    【讨论】:

    • 谢谢,但我正在开发一个库,它可能有来自客户端的未处理异常/抛出错误。
    • 好的,那么要处理任何类型的错误,您可以使用@expectedException PHPUnit\Framework\Error 注释 (phpunit.de/manual/current/en/…) 或者如果您有兴趣检测到底生成了哪个错误 - set_error_handler 总是有帮助
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2020-02-09
    • 2016-04-21
    • 2013-01-27
    • 2019-03-04
    • 2021-06-16
    • 2016-06-13
    • 2021-04-27
    相关资源
    最近更新 更多