在PHPUnit测试中有没有办法'期望'输出到error_log?

时间:2014-02-14 16:16:36

标签: php unit-testing phpunit syslog

使用phpunit进行单元测试时,有没有办法对从'error_log(“Message”)调用创建的输出运行测试?

示例代码,我的一个函数使用luhn算法测试信用卡:

if($checkLuhn && ($this->_luhn_check($cardNumber) == false)) {
    error_log(__METHOD__ . " cardNumber failed luhn algorithm check.");
    return false;
}

$ checkLuhn是传入的一个布尔值,告诉它是否进行检查,如果$ cardNumber通过,_luhn_check()返回true。问题是,我在这个函数中有多个测试可以返回false。我可以在返回值上使用assertEquals,但也想检查抛出错误的原因。

你能否以某种方式覆盖error_log或以其他方式获取单元测试中的syslog输出?

3 个答案:

答案 0 :(得分:6)

有几种不同的方法来指导error_log()发送数据的位置。

首先是将error_log()发送到其他地方。一个例子是:

error_log( 'This is a message from error_log()', 3, '/dev/stdout' );

使用destination option for error_log()

另一种方法是覆盖error_log ini setting in PHP。这看起来像是:

$cur_error_log = ini_get( 'error_log' );
ini_set( 'error_log', '/dev/stdout' );
error_log( 'This is a message from error_log()' );
ini_set( 'error_log', $cur_error_log );

在这两个选项中,我通常更喜欢在error_log()中使用destination选项。

从那里你可以使用PHPUnit中的expectOutputString()来查找从error_log()发送的数据。

答案 1 :(得分:0)

我无法使用error_log,但能够使用trigger_error检查错误。尝试使用注释。

 * @expectedException PHPUnit_Framework_Exception
 * @expectedExceptionMessageRegExp /failed/

https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.expectedException

另见:

How to execute code after trigger_error(..., E_USER_WARNING) in unit test (PHPUnit)?

答案 2 :(得分:0)

您可以使用Zend的uopz扩展来重载这些函数。 我一直都在使用它们。这是一个例子:

/**
 * Requires the following set in php.ini: 
 * - zend_extension=php_uopz.dll;
 * - uopz.overloads=1
 * 
* @author Aap Noot
*/
class MyClass extends PHPUnit_Framework_TestCase {
    public static $error_log = array();

     /**
     * Overload error_log function
     * @see PHPUnit_Framework_TestCase::setUpBeforeClass()
     */
    public static function setUpBeforeClass() {
        uopz_backup ( "error_log" );
        uopz_function ( "error_log", function ($message, $message_type = null, $destination = null, $extra_headers = null) {
            // We are only interested in the message
            MyClass::$error_log[] = $message;
        } );
        parent::setUpBeforeClass ();

    /**
     * Restore function(s)
     * @see PHPUnit_Framework_TestCase::tearDownAfterClass()
     */
    public static function tearDownAfterClass() {
        uopz_restore ( "error_log" );
        parent::tearDownAfterClass ();
    } 

    /**
    * Set up per test case
    * @see PHPUnit_Framework_TestCase::setUp()
    */
    protected function setUp() {
        parent::setUp ();
        MyClass::$error_log = array();
    }

    /**
     * Test error log
     * MyClass::$error_log should be an array with the error message
     */
    public function testErrorLog() {
        // Test response
        error_log("This message will be captured");

        // Test error log
        $this->assertNotEmpty(MyClass::$error_log);
    }
}