使用PHPUnit断言异常

时间:2015-07-27 09:15:08

标签: php phpunit

我正在使用PHPUnit测试此函数:

public function testSetAdsData_dataIsNull()
{
    $dataArr = null;
    $fixture = new AdGroup();
    try {
        $fixture->setAdsData($dataArr);
    } catch (Exception $e) {
        $this->assertEquals($e->getCode(), 2);
    }

    $this->assertEmpty($fixture->ads);
    $this->assertEmpty($fixture->adIds);
}

我被告知这不是正确的方法,我应该使用@expectedException,所以我开始阅读手册和一些答案,包括这个流行的: PHPUnit assert that an exception was thrown?

但经过大量的阅读后,我仍然不明白除了我最初的方法之外,使用它的好处是什么。我想这与我真的不懂如何使用它的事实有关。我尝试了不同的方法,但它们都没有实际发挥作用。

我意识到我可以在代码中添加这样的一行:

throw new MyException('Some Error Msg', 2);

然后我也需要使用try catch(或者我理解)所以有什么好处?

1 个答案:

答案 0 :(得分:0)

我在测试中看到了两个问题。

1)测试可以通过而不会抛出异常。在函数调用之后,您应该添加$this->fail('No Exception was thrown')。使用setExpectedException将为您执行此操作,如果您不抛出异常,测试将失败。在您的情况下,如果发生这种情况,您没有失败的情况。您需要设置一个标志并断言在catch块之后抛出异常。

2)您正在测试中捕获一般异常。这不是一个好习惯。如果您有使用模拟的测试,则通过抛出异常来发出模拟失败的断言信号。你的测试将在哪里捕捉和处理。再次让你的测试看起来通过它实际上没有。 (这也可能表现为其他断言失败并在尝试修复测试时引起很多惊愕)。

在您的示例测试中,您希望使用try-catch,因为在执行代码后您正在执行进一步的断言。 setExpectedException不允许您这样做。在幕后,此方法/注释将您的测试包装在自己的try catch中,并为您验证异常。这几次正是你要找的。