测试时如何查看通知?

How to view notices when testing?

我有一个 class 发出非致命通知:

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 自然会将此通知转换为异常,未捕获的异常必然会导致测试失败。

There was 1 error:

1) MyClassTest::testCanFoo
Notice this message.

首先,让我指出,我很高兴能够阅读此通知, 正是我想要的,但是 未通过测试.

我知道我可以通过 docblock.

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

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

PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

. 1 / 1 (100%)

Time: 17 ms, Memory: 4.00MB

OK (1 test, 1 assertion)

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

您可以通过这种方式禁止转换为异常:

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());
    }
}

使用 Netsilik/BaseTestCase(MIT 许可证)您可以直接测试触发 Errors/Warnings,而无需将它们转换为异常。

您可以测试正确的 Waring/Notice 类型和错误消息:

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');
    }
}

干杯。