使用PHPUnit断言异常


Asserting exceptions using 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断言抛出了一个异常?

但是在阅读了相当多的内容之后,我仍然不明白除了我最初的方法之外,使用这种方法的好处是什么。我想这和我不知道如何使用它有关。我尝试了不同的方法,但没有一种有效。

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

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

但随后我需要使用try catch(或我理解的),那么好处是什么?

我看到你的测试有两个问题。

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

2)你在测试中捕获了一个通用异常。这不是一个好习惯。如果您有一个使用模拟的测试,则通过抛出异常来表示来自模拟的失败断言。这里的测试将捕获并处理。再一次让你的测试看起来通过了,但实际上没有。(这也可以表现为其他断言失败,并在试图修复测试时引起许多混乱)。

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