为什么PHPUnit在预期异常时会忽略断言?
我在一个配置类上有一个简单的单元测试用例(广泛的问题),根据设计,它会在类型不匹配和未定义的配置设置上触发PHP错误。除此错误外,该方法将退出,并返回为什么PHPUnit在预期异常时会忽略断言?,php,unit-testing,tdd,phpunit,Php,Unit Testing,Tdd,Phpunit,我在一个配置类上有一个简单的单元测试用例(广泛的问题),根据设计,它会在类型不匹配和未定义的配置设置上触发PHP错误。除此错误外,该方法将退出,并返回false 在我的测试用例中,我希望有一些测试失败。问题是,我无法对返回值进行简单的“断言”:在运行测试期间抛出的每个错误都将转换为PHPUnit\u Framework\u error异常 现在我可以让PHPUnit意识到我在期待一个错误: /** * @expectedException PHPUnit_Framework_Error */
false
在我的测试用例中,我希望有一些测试失败。问题是,我无法对返回值进行简单的“断言”:在运行测试期间抛出的每个错误都将转换为PHPUnit\u Framework\u error
异常
现在我可以让PHPUnit意识到我在期待一个错误:
/**
* @expectedException PHPUnit_Framework_Error
*/
public function testSetInvalidKey()
{
$this->assertEquals(true, conf::set("invalid_key", "12345"));
}
这很好,但我不明白的是,该函数中的任何附加断言都不会被计算。无论它是否会失败,PHPUnit似乎只等待异常发生,并在异常发生时对整个函数感到满意
也就是说,此测试将正常运行:
/**
* @expectedException PHPUnit_Framework_Error
*/
public function testSetInvalidKey()
{
// The error will be triggered here
$this->assertEquals(true, conf::set("invalid_key", "12345"));
$this->assertEquals(12345, 67810); // Huh?
$this->assertEquals("abc", "def"); // Huh?
$this->assertEquals(true, false); // Huh?
}
为什么??这是故意的行为吗
我知道您只是将断言分成不同的函数,但我想了解其行为。因为conf::set()
是在方法testSetInvalidKey()
内执行的,所以相应的catch块必须在外部。一旦捕获并记录为预期的异常,我不知道PHP如何在第一次断言之后恢复执行
极端psuedo代码:
class Tester
{
public function run()
{
try {
$test->testSetInvalidKey();
}
catch (PHPUnit_Framework_Error $e) {
// Expected exception caught! Woohoo!
// How can I continue to run the above method where I left off?
}
}
}
对于那些相信“每个测试1断言”公理的人来说,这种行为是一个很好的支持者 php单元能够测试异常。看看:
这并不能真正解决OP的问题;问题是在抛出异常后如何在测试中继续执行。您描述的行为是预期的。正如抛出异常会停止被测试类的执行一样,抛出异常也会停止测试的执行(直到捕获并处理异常)。