如何在测试时查看通知?

时间:2016-09-16 16:35:52

标签: php phpunit

我有一个发布非致命通知的课程:

class MyClass {
    public function foo(){
        trigger_error('Notice this message.', E_USER_NOTICE);
        return true;
    }
}

这是一个基本的单元测试:

class MyClassTest extends PHPUnit_Framework_TestCase {
    public function testCanFoo(){
        $obj = new MyClass;
        $this->assertTrue($obj->foo());
    }
}

当然,PHPUnit会将此通知转换为异常,但未被捕获必然会使测试失败。

  

有1个错误:

     

1)MyClassTest :: testCanFoo
  请注意此消息。

首先,我要指出,我喜欢我可以阅读此通知, 是我想要的,没有使测试失败

我知道我可以通过docblock传递测试。

class MyClassTest extends PHPUnit_Framework_TestCase {
    /**
     *  @expectedException PHPUnit_Framework_Error_Notice
     */
    public function testCanFoo(){
        $obj = new MyClass;
        $this->assertTrue($obj->foo());
    }
}

但现在通知完全被吞没了。

  

Sebastian Bergmann和贡献者的PHPUnit 5.5.4。

     

。 1/1(100%)

     

时间:17毫秒,内存:4.00MB

     

好(1次测试,1次断言)

如何才能 通过测试查看通知消息?

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式禁用转换为异常:

class MyClassTest extends PHPUnit_Framework_TestCase {
    public function testCanFoo(){
        // disable conversion into exception
        PHPUnit_Framework_Error_Notice::$enabled = false;
        $obj = new MyClass;
        $this->assertTrue($obj->foo());
    }
}

答案 1 :(得分:0)

使用Netsilik/BaseTestCase(MIT许可证),您可以直接测试触发的错误/警告,而无需将其转换为异常。

您可以同时测试警告/通知类型和错误消息:

composer require netsilik/base-test-case


测试E_USER_NOTICE

<?php
namespace Tests;

class MyTestCase extends \Netsilik\Testing\BaseTestCase
{
    /**
     * {@inheritDoc}
     */
    public function __construct($name = null, array $data = [], $dataName = '')
    {
        parent::__construct($name, $data, $dataName);

        $this->_convertNoticesToExceptions  = false;
        $this->_convertWarningsToExceptions = false;
        $this->_convertErrorsToExceptions   = true;
    }

    public function test_whenNoticeTriggered_weCanTestForIt()
    {
        $foo = new Foo();
        $foo->bar();

        self::assertErrorTriggered(E_USER_NOTICE, 'The notice string');
    }
}

干杯。