【问题标题】:executing assertions after exception is thrown using phpunit在使用 phpunit 引发异常后执行断言
【发布时间】:2015-07-27 14:44:19
【问题描述】:

我开始使用 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);
  }
}

但现在没有抛出异常。我应该这样离开它并从顶部删除期望部分还是有更好的方法来做到这一点?谢谢

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    是的,你需要去掉expectedException 注释。您正在捕获异常,因此现在不会抛出它。确实,还有一个问题:现在,如果不抛出异常,测试就会通过。

    解决方法是在断言后面加一个return语句,在没有抛出异常的情况下手动使测试失败:

    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');
    }
    

    另一个建议:使用异常子类。如果抛出异常但不是出于您期望的原因,则测试将通过,但行为可能与实际代码中的预期不同。如果您只捕获某种类型的异常,您将确定引发该异常的原因是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-21
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2011-01-26
      • 2012-04-07
      相关资源
      最近更新 更多