【问题标题】:Asserting exceptions using PHPUnit使用 PHPUnit 断言异常
【发布时间】:2015-07-27 09:15:07
【问题描述】:

我正在使用 PHPUnit 测试这个函数:

public function testSetAdsData_dataIsNull()
{
    $dataArr = null;
    $fixture = new AdGroup();
    try {
        $fixture->setAdsData($dataArr);
    } catch (Exception $e) {
        $this->assertEquals($e->getCode(), 2);
    }

    $this->assertEmpty($fixture->ads);
    $this->assertEmpty($fixture->adIds);
}

有人告诉我这不是正确的方法,我应该使用@expectedException,所以我开始阅读手册和这里的一些答案,包括这个流行的答案: PHPUnit assert that an exception was thrown?

但是经过大量阅读后,除了我最初的方法之外,我仍然不明白使用它有什么好处。我想这与我并不真正了解如何使用它有关。我尝试了不同的方法,但都没有真正奏效。

我意识到我可以在代码中添加这样的一行:

throw new MyException('Some Error Msg', 2);

但是我也需要使用 try catch (或者我理解)那么有什么好处?

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    我发现您的测试存在 2 个问题。

    1) 测试可以通过而不会引发异常。在你的函数调用之后,你应该添加一个$this->fail('No Exception was thrown')。使用setExpectedException 将为您完成此操作,如果您不抛出异常,测试将失败。在你的情况下,如果发生这种情况,你没有失败的情况。您需要设置一个标志并断言在 catch 块之后引发了异常。

    2) 您在测试中发现了一个通用异常。这不是一个好习惯。如果您有一个使用模拟的测试,来自模拟的失败断言会通过抛出异常发出信号。您的测试将在此处捕获和处理。再次使您的测试看起来通过,而实际上却没有。 (这也可能表现为其他断言失败并在尝试修复测试时引起极大的恐慌)。

    在您的示例测试中,您希望使用 try-catch,因为您在执行代码后会进行进一步的断言。 setExpectedException 不允许您这样做。在幕后,此方法/注释将您的测试包装在自己的 try catch 中并为您验证异常。很多次正是您正在寻找的。​​p>

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2011-01-26
      • 2018-09-26
      • 2020-10-25
      • 2020-03-13
      相关资源
      最近更新 更多