期待异常后,PHPUnit不会继续测试

前端之家收集整理的这篇文章主要介绍了期待异常后,PHPUnit不会继续测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么 PHPUnit不会在此代码中执行最后的异常断言?
public function testConfigOverriding()
{
    $this->dependencyContainer = new DependencyContainer(__DIR__ . "/../../Resources/valid_json.json");
    $this->assertEquals('overriden',$this->dependencyContainer->getConfig('shell_commander')['pygmentize_command']);

    $unexisting = "unexisting_file";
    $this->setExpectedException('Exception',"Configuration file at path \"$unexisting\" doesn't exist.");
    $this->dependencyContainer = new DependencyContainer($unexisting);

    $invalid = __DIR . "/../../Resources/invalid_json.json";
    $this->setExpectedException('Exception',"Configuration JSON file provided is not valid.");
    $this->dependencyContainer = new DependencyContainer($invalid);
}

所以基本上是:它测试是否抛出了“unexsisting_file”异常,但完全忽略“无效的json”测试.我需要针对每个抛出的异常进行单独的测试吗?

即使使用setExpectedException,您的测试仍然是常规的PHP代码,并遵循PHP的正常规则.如果抛出异常,程序流将立即跳出当前上下文,直到达到一个try / catch块.

PHPUnit中,当您使用setExpectedException时,它会告诉PHPUnit的核心,当它应该期待即将运行的代码中的异常时.因此,它会使用try / catch块等待它,如果捕获被调用的异常类型,则传递测试.

但是,在测试方法中,正常的PHP规则仍然适用 – 当异常发生时,这是当前代码块的结尾.除非您在测试方法中有自己的try / catch块,否则不会再执行该方法.

所以,为了测试多个异常,你有几个选择:

>将自己的try / catch添加到测试方法中,以便在第一个例外之后,您可以在该方法中继续进行进一步的测试.
>将测试分成单独的方法,以便每个异常都在自己的测试中.
>这个特殊的例子看起来好像是使用PHPUnit的dataProvider机制,因为你基本上是用两组数据来测试相同的功能. dataProvider功能允许您定义一个单独的函数,其中包含要测试的每组值的输入数据数组.然后将这些值一次传递到测试方法中.你的代码看起来像这样:

/**
 * @dataProvider providerConfigOverriding
 */
public function testConfigOverriding($filename,$expectedExceptionText) {
    $this->dependencyContainer = new DependencyContainer(__DIR__ . "/../../Resources/valid_json.json");
    $this->assertEquals('overriden',$this->dependencyContainer->getConfig('shell_commander')['pygmentize_command']);

    $this->setExpectedException('Exception',$expectedExceptionText);
    $this->dependencyContainer = new DependencyContainer($filename);
}

public function providerConfigOverriding() {
    return array(
        array('unexisting_file','Configuration file at path "unexisting_file" doesn\'t exist.'),array(__DIR__ . "/../../Resources/invalid_json.json","Configuration JSON file provided is not valid."),);
}

希望有帮助.

猜你在找的PHP相关文章