【问题标题】:Why is PHPUnit ignoring assertions when expecting an exception?为什么 PHPUnit 在期望异常时忽略断言?
【发布时间】:2011-01-26 04:07:23
【问题描述】:

我有一个关于配置类的简单单元测试用例(广泛的问题here),它通过设计触发类型不匹配和未定义配置设置的 PHP 错误。除错误外,方法退出返回false

在我的测试用例中,我希望有一些测试失败。麻烦的是,我不能对返回值做一个简单的“断言”:运行测试期间抛出的每个错误都将转换为PHPUnit_Framework_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?

 }

为什么?这是预期的行为吗?

我知道您只是将断言分成不同的函数,但我想了解其行为。

【问题讨论】:

  • 您所描述的行为是预期的。就像抛出异常会停止被测类的执行一样,抛出异常会停止测试的执行(直到异常被捕获和处理)。

标签: php unit-testing tdd phpunit


【解决方案1】:

由于conf::set() 在方法testSetInvalidKey() 内执行,相应的catch 块必须在外部。一旦被捕获并记录为预期的异常,我看不到 PHP 如何在第一个断言之后恢复执行。

极端伪代码:

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 个断言的人来说,这种类型的行为将是一个很好的支持者。

【讨论】:

    【解决方案2】:

    php 单元具有测试异常的能力。看看:

    http://www.phpunit.de/manual/3.2/en/writing-tests-for-phpunit.html

    【讨论】:

    • 这并没有真正解决 OP 的问题;问题是抛出异常后如何在测试中继续执行。
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2018-08-21
    • 2011-09-30
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多