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

时间:2015-07-27 14:44:19

标签: php 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

1 个答案:

答案 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子类。如果抛出异常但不是出于您期望的原因,则测试将通过,但可能行为不是实际代码中的预期。如果只捕获某种类型的异常,则可以确定异常是由于正确的原因引发的。