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

使用phpunit在抛出异常后执行断言,php,phpunit,Php,Phpunit,我开始使用phpunit,遇到了这个问题,我想知道什么是最好的方法来处理它。我正在测试以下功能: /** * @expectedException PHPUnit_Framework_Error */ function testSetAdsData_dataIsNull() { $dataArr = null; $fixture = new AdGroup(); $fixture->setAdsData($dataArr); $this->ass

我开始使用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');
}
另一个建议是:使用异常子类。如果抛出异常,但不是出于您预期的原因,则测试将通过,但该行为可能不是实际代码中预期的。如果您只捕获特定类型的异常,您将确保引发异常的原因是正确的