我正在使用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中,并为您验证异常。很多时候,这正是你想要的。