【问题标题】:SimpleTest: How to assert that a PHP error is thrown?SimpleTest:如何断言抛出了 PHP 错误?
【发布时间】:2010-10-11 08:45:15
【问题描述】:

如果我是正确的,SimpleTest 将允许你断言一个 PHP 错误被抛出。但是,根据文档,我无法弄清楚如何使用它。我想断言我传入构造函数的对象是MyOtherObject的一个实例@

class Object {
    public function __construct(MyOtherObject $object) {
        //do something with $object
    }
}

//...and in my test I have...
public function testConstruct_ExpectsAnInstanceOfMyOtherObject() {
    $notAnObject = 'foobar';
    $object = new Object($notAnObject);
    $this->expectError($object);
}

我哪里错了?

【问题讨论】:

    标签: php unit-testing simpletest


    【解决方案1】:

    PHP 既有错误也有异常,它们的工作方式略有不同。将错误类型传递给类型提示函数将引发异常。你必须在你的测试用例中抓住它。例如:

    public function testConstruct_ExpectsAnInstanceOfMyOtherObject() {
      $notAnObject = 'foobar';
      try {
        $object = new Object($notAnObject);
        $this->fail("Expected exception");
      } catch (Exception $ex) {
        $this->pass();
      }
    }
    

    或者简单地说:

    public function testConstruct_ExpectsAnInstanceOfMyOtherObject() {
      $this->expectException();
      $notAnObject = 'foobar';
      $object = new Object($notAnObject);
    }
    

    但请注意,这将在发生异常的行之后停止测试。

    【讨论】:

    • 我没有给你投反对票。但是,我想我应该提一下为什么我认为有人会否决它:这个答案与“例外”有关,而不是“错误”。当类型提示选择错误的类型时,它会抛出“错误”而不是“异常”。
    【解决方案2】:

    您必须在错误发生之前预料到错误,然后 SimpleTest 将吞下它并计算通过,如果测试到最后并且没有错误,那么它将失败。 (对于 PHP(非致命)错误和异常,expectError 和 expectException 的作用相同。)

    【讨论】:

      【解决方案3】:

      事实证明,SimpleTest 实际上并不支持这一点。您无法在 SimpleTest 中发现致命的 PHP 错误。类型提示很棒,但您无法对其进行测试。类型提示会引发致命的 PHP 错误。

      【讨论】:

      • 从 PHP 5.2 版开始,SimpleTest 可以捕获类型提示错误。看我的回答。
      【解决方案4】:

      类型提示抛出 E_RECOVERABLE_ERROR,自 PHP 5.2 版本起 SimpleTest 可以捕获该错误。以下将捕获包含文本“必须是一个实例”的任何错误。 PatternExpectation 的构造函数采用 perl 正则表达式。

      public function testConstruct_ExpectsAnInstanceOfMyOtherObject() {
          $notAnObject = 'foobar';
          $this->expectError(new PatternExpectation("/must be an instance of/i"));
          $object = new Object($notAnObject);
      }
      

      【讨论】:

      • 我还没有验证这一点,所以我只是假设这是真的。感谢您的回答!
      猜你喜欢
      • 2020-07-08
      • 2020-02-26
      • 2012-06-25
      • 2019-04-19
      • 1970-01-01
      • 2016-02-11
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多