我开始使用phpunit并遇到了这个问题我想知道什么是处理它的最佳方法。我正在测试以下功能:
/**
* @expectedException PHPUnit_Framework_Error
*/
function testSetAdsData_dataIsNull()
{
$dataArr = null;
$fixture = new AdGroup();
$fixture->setAdsData($dataArr);
$this->assertEmpty($fixture->ads);
$this->assertEmpty($fixture->adIds);
}
现在行$fixture->setAdsData($dataArr);
抛出一个异常,因为我想要并且没问题,但问题是以下两个断言不会执行。所以我读了它并理解如果我想执行以下两个断言我需要使用try / catch,所以我的问题是,
这样做的正确方法是什么?
我试着这样做:
/**
* @expectedException PHPUnit_Framework_Error
*/
function testSetAdsData_dataIsNull()
{
$dataArr = null;
$fixture = new AdGroup();
try{
$fixture->setAdsData($dataArr);
} catch (Exception $e){
$this->assertEmpty($fixture->ads);
$this->assertEmpty($fixture->adIds);
}
}
但现在没有抛出异常。我应该这样离开,只是从顶部删除期望部分或有更好的方法吗? THX
答案 0 :(得分:1)
是的,你需要摆脱expectedException
注释。您正在捕捉异常,因此现在不会被抛出。实际上,还有另一个问题:现在,如果没有抛出异常,测试将通过。
解决方案是在断言后使用返回语句,并在未抛出异常时手动使测试失败:
function testSetAdsData_dataIsNull()
{
$dataArr = null;
$fixture = new AdGroup();
try {
$fixture->setAdsData($dataArr);
} catch (Exception $e){
$this->assertEmpty($fixture->ads);
$this->assertEmpty($fixture->adIds);
return;
}
$this->fail('Exception not thrown');
}
另一个建议:使用Exception子类。如果抛出异常但不是出于您期望的原因,则测试将通过,但可能行为不是实际代码中的预期。如果只捕获某种类型的异常,则可以确定异常是由于正确的原因引发的。