我开始使用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
是的,您需要去掉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子类。如果抛出了一个异常,但不是您所期望的原因,测试将通过,但可能行为不是实际代码中所期望的。如果只捕获某种类型的异常,则可以确保异常的引发是出于正确的原因。