期待异常后,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."),);
}

希望有帮助.

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...