为什么
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."),); }
希望有帮助.