3

I'm trying to write PHPUnit tests for a class that writes to error_log but seem to be having trouble with PHPUnit's output buffering.

Because of the potential volatility of error_log given an unknown SUT php.ini configuration, I ultimately decided upon writing to stdout after having limited success with overloading via namespace.

Unfortunately, there appears to be some quirk in how PHPUnit is buffering output in that calling expectOutputString returns an empty string as "Actual" rather than what was written to stdout.

Here's a quick-and-dirty test class I wrote to eliminate anything that might be giving me unintended grief ("ObTest.php"):

<?php
namespace Some\Test;

class ObTest
{
    public function writeToErrorLog($message)
    {
        error_log($message);
    }
}

And here's the test I wrote:

<?php

namespace Some\Test;

include "ObTest.php";

class ObTestTest extends \PHPUnit_Framework_TestCase
{
    public static $error_log_config;

    public static function setUpBeforeClass()
    {
        self::$error_log_config = ini_get("error_log");

        ini_set("error_log", "/dev/stdout");
    }

    public static function tearDownAfterClass()
    {
        ini_set("error_log", self::$error_log_config);
    }

    public function testWriteToErrorLogOutputs()
    {
        $ob_test = new ObTest();

        $this->expectOutputString("Test");

        $ob_test->writeToErrorLog("Test");
    }
}

And finally the output:

PHPUnit 5.4-g9b5b99b by Sebastian Bergmann and contributors.

[06-May-2016 01:05:51 UTC] Test

Failed asserting that two strings are equal.
Expected :'Test'
Actual   :''

Note that I do realize that the test will fail anyway due to the timestamp, but writing a test with expectOutputRegex is unnecessary to demonstrate the blank string being returned as "Actual"; I can confirm that I get the same result using the regex option.

I'm running PHP 5.6.20-1+deb.sury.org~trusty+1 if it's relevant.

Update 2016-05-22

Per the comments, I have tried several variants of setting error_log to write to output, including the STDOUT constant and php://output stream, all with no success.

For anyone interested or encountering a similar issue, I also have since logged an issue on GitHub thinking that this may be some sort of bug, but it hasn't yet received any attention as of this update. The issue notes that I've also tried this on the latest stable PHPUnit version (5.3.2) without success.

Community
  • 1
  • 1
Derek
  • 827
  • 11
  • 23

0 Answers0