如何在PHPUnit中捕获PHP警告

时间:2011-02-19 22:21:31

标签: phpunit

我正在编写测试用例,这是我的问题。

所以说我正在测试一个简单的函数someClass::loadValue($value)

正常的测试用例很简单,但假设在传入null或-1时,函数调用会生成一个PHP警告,这被认为是一个错误。

问题是,如何编写我的PHPUnit测试用例,以便在函数正常处理null / -1时成功,并在抛出PHP警告时失败?

谢谢,

6 个答案:

答案 0 :(得分:36)

PHPUnit_Util_ErrorHandler::handleError()根据错误代码抛出几种异常类型之一:

  • PHPUnit_Framework_Error_Notice代表E_NOTICEE_USER_NOTICEE_STRICT
  • PHPUnit_Framework_Error_Warning代表E_WARNINGE_USER_WARNING
  • 所有其他人
  • PHPUnit_Framework_Error

你可以捕捉并期望这些,就像你遇到的任何其他例外一样。

/**
 * @expectedException PHPUnit_Framework_Error_Warning
 */
function testNegativeNumberTriggersWarning() {
    $fixture = new someClass;
    $fixture->loadValue(-1);
}

答案 1 :(得分:7)

对我有用的是将我的phpunit.xml修改为

<phpunit
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         strict="true"
         >
</phpunit>

关键是使用strict="true"来获取警告,导致测试失败。

答案 2 :(得分:7)

我会创建一个单独的案例来测试预期通知/警告的时间。

对于PHPUnit v6.0 +,这是最新语法:

use PHPUnit\Framework\Error\Notice;
use PHPUnit\Framework\Error\Warning;
use PHPUnit\Framework\TestCase;

class YourShinyNoticeTest extends TestCase
{

    public function test_it_emits_a_warning()
    {
        $this->expectException(Warning::class);

        file_get_contents('/nonexistent_file'); // This will emit a PHP Warning, so test passes
    }


    public function test_it_emits_a_notice()
    {
        $this->expectException(Notice::class);

        $now = new \DateTime();
        $now->whatever; // Notice gets emitted here, so the test will pass
    }
}

答案 3 :(得分:3)

您还可以使用以下命令编写phpunit.xml文件(在测试目录上):

<phpunit 
convertErrorsToExceptions="true" 
convertNoticesToExceptions="false" 
stopOnFailure="false">
</phpunit>

答案 4 :(得分: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 warning string');
    }
}

希望这对以后的人有帮助。

答案 5 :(得分:-2)

Make SomeClass在输入无效时抛出错误并告诉phpUnit预期错误。

一种方法是:

class ExceptionTest extends PHPUnit_Framework_TestCase
{
    public function testLoadValueWithNull()
    {
        $o = new SomeClass();            
        $this->setExpectedException('InvalidArgumentException');
        $this->assertInstanceOf('InvalidArgumentException', $o::loadValue(null));
    }
}

有关更多方法,请参阅documentation