使用phpunit抛出异常后执行断言


executing assertions after exception is thrown using phpunit

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