为什么PHPUnit在预期异常时会忽略断言?

为什么PHPUnit在预期异常时会忽略断言?,php,unit-testing,tdd,phpunit,Php,Unit Testing,Tdd,Phpunit,我在一个配置类上有一个简单的单元测试用例(广泛的问题),根据设计,它会在类型不匹配和未定义的配置设置上触发PHP错误。除此错误外,该方法将退出,并返回false 在我的测试用例中,我希望有一些测试失败。问题是,我无法对返回值进行简单的“断言”:在运行测试期间抛出的每个错误都将转换为PHPUnit\u Framework\u error异常 现在我可以让PHPUnit意识到我在期待一个错误: /** * @expectedException PHPUnit_Framework_Error */

我在一个配置类上有一个简单的单元测试用例(广泛的问题),根据设计,它会在类型不匹配和未定义的配置设置上触发PHP错误。除此错误外,该方法将退出,并返回
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的问题;问题是在抛出异常后如何在测试中继续执行。您描述的行为是预期的。正如抛出异常会停止被测试类的执行一样,抛出异常也会停止测试的执行(直到捕获并处理异常)。