【问题标题】:PHPUnit doesn't catch expected exceptionsPHPUnit 没有捕捉到预期的异常
【发布时间】:2011-05-08 17:21:58
【问题描述】:

我有一组测试,我想测试我的类是否在正确的时间抛出异常。在示例中,我的类使用了 __get() 魔术方法,因此我需要测试检索到无效属性时是否引发异常:

function testExceptionThrownWhenGettingInvalidProperty() {
  $obj = new MyClass();
  $this->setExpectedException("Property qwerty does not exist");
  $qwerty = $obj->qwerty;
}

该类按应有的方式抛出一个错误,但不是仅仅获得通过,而是没有捕获异常!

There was 1 error:

1) QueryTest::testExceptionThrownWhenGettingInvalidProperty
Exception: Property qwerty does not exist

我之前使用过 SimpleTest,$this->expectException(new Exception("Property qwerty does not exist")); 工作得很好。我知道还有其他方法(@expectedException 和 try-catch),但是这个应该可以工作,而且看起来更干净。有什么想法可以让我完成这项工作吗?

【问题讨论】:

    标签: php unit-testing exception phpunit


    【解决方案1】:

    它不是在寻找异常中的文本,它是在寻找异常类的名称...Docs

    $this->setExpectedException('Exception');
    

    当您使用SPL Exceptions 或自定义异常类时,它非常方便...

    【讨论】:

    • 谢谢!我完全忽略了这一点,因为我习惯了 SimpleTest 的做法。你知道是否有一种简单的方法来测试文本吗?
    • @Nathan, @ircmaxell:看我的回答,有更好的方法,包括测试文本。
    • @ircmaxell:我不同意这条无关紧要的信息。您看不到任何设计良好的语言或框架会为弹出的每个新错误创建一个新异常。那工作量太大了。
    • setExpectedException 实际上需要 3 个参数,最后 2 个是可选的 - 如果您想测试异常类型和消息内容,则 $this->setExpectedException('Exception', 'Property qwerty does not exist' );如果您也有并且想要测试异常代码,那么这将是第三个参数。
    • 哦,我明白@ryeguy,但你也不知道catch (FooException $e) { switch ($e->getMessage()) { case 'blah1': ...异常应该定义出了什么问题(以InvalidArugmentException为例),代码应该弄清楚如何处理它基于调用。消息是用于调试的...不是在代码中捕获错误(然后消息将成为一个魔术字符串)...
    【解决方案2】:

    除了 ircmaxell 的回答之外,实际上还有一种更简单的方法:

    /**
     * @expectedException MyExceptionClass
     * @expectedExceptionMessage Array too small
     */
    public function testSomething()
    {
    }
    

    @expectedException 是预期异常的类名,@expectedExceptionMessage 是预期异常消息的子字符串(没错,您不必拥有整个消息)。

    如果您不想使用 docblock 注释,这两个实际上都可以作为测试用例中的方法使用。

    【讨论】:

    • +1...我不知道@expectedExceptionMessage docblock 元素...每天学习新东西...
    • @ircmaxell:是的,我自己刚刚发现它。除了“注释”附录之外,其他任何地方都没有提到它。即使那样,上面也没有文档,它只是列出了它的名字。
    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2015-11-21
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多