Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHPUnit断言异常_Php_Phpunit - Fatal编程技术网

使用PHPUnit断言异常

使用PHPUnit断言异常,php,phpunit,Php,Phpunit,我正在使用PHPUnit测试此函数: public function testSetAdsData_dataIsNull() { $dataArr = null; $fixture = new AdGroup(); try { $fixture->setAdsData($dataArr); } catch (Exception $e) { $this->assertEquals($e->getCode(), 2);

我正在使用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
,所以我开始阅读手册和这里的一些答案,包括这个流行的答案:

但是在阅读了相当多的书之后,我仍然不明白除了我最初的方法之外,使用这种方法还有什么好处。我想这与我不知道如何使用它有关。我尝试了不同的方法,但没有一种真正起作用

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

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

但是我也需要使用try-catch(或者我理解的那样),那么它的好处是什么呢?

我发现您的测试有两个问题

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

2) 您正在测试中捕获一个通用异常。这不是一个好的实践。如果您有一个使用mock的测试,那么来自mock的失败断言将通过抛出异常发出信号。你在这里的测试将捕获并处理。再次让你的测试看起来通过了,而实际上却没有。(当试图修复测试时,其他断言也会失败并引起很多恐慌)


在您的示例测试中,您希望使用try-catch,因为您在执行代码后正在执行进一步的断言
setExpectedException
不允许您执行此操作。在幕后,此方法/注释将您的测试包装在自己的try-catch中,并为您验证异常。很多时候这正是你想要的。

我在你的测试中发现了两个问题

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

2) 您正在测试中捕获一个通用异常。这不是一个好的实践。如果您有一个使用mock的测试,那么来自mock的失败断言将通过抛出异常发出信号。你在这里的测试将捕获并处理。再次让你的测试看起来通过了,而实际上却没有。(当试图修复测试时,其他断言也会失败并引起很多恐慌)

在您的示例测试中,您希望使用try-catch,因为您在执行代码后正在执行进一步的断言
setExpectedException
不允许您执行此操作。在幕后,此方法/注释将您的测试包装在自己的try-catch中,并为您验证异常。很多时候这正是你想要的