Erro de desserialização quando @runInSeparateProcess

Estou implementando um módulo que fornecerá uma API para trabalhar e gerenciar sessões PHP. Estou testando oSession\Manager implementação que permitirá aos usuários iniciar sessões, definir IDs, obter IDs, destruir sessões, etc. Estou testando os métodos dessa classe em um processo separado, usando o PHPUnit@runInSeparateProcess anotação. Quando eu uso essa anotação, recebo uma exceção lançada pelo PHPUnit devido a um erro de desserialização. Quando não uso a anotação, o teste é executado como esperado e falha em null, não sendo igual a false.

Aqui está o teste causando o erro. Até agora, nenhum detalhe de implementação foi feito, todos os métodos para a interface existem, mas não executam operações.

class ManagerTest extends PHPUnitTestCase {

    /**
     * Ensures that if the session has not been started yet the sessionExists
     * method returns false.
     *
     * @runInSeparateProcess
     */
    public function testSessionExistsWhenSessionHasNotBeenStarted() {
        $Manager = new \Session\Manager();
        $this->assertFalse($Manager->sessionExists());
    }

}

Consegui rastrear o problema até o seguintePHPUnit_Util_PHP::runJob() método. Estou executando o PHPUnit 3.7.5 e orunJob método sendo invocado é:

/**
 * Runs a single job (PHP code) using a separate PHP process.
 *
 * @param  string                       $job
 * @param  PHPUnit_Framework_TestCase   $test
 * @param  PHPUnit_Framework_TestResult $result
 * @return array|null
 * @throws PHPUnit_Framework_Exception
 */
public function runJob($job, PHPUnit_Framework_Test $test = NULL, PHPUnit_Framework_TestResult $result = NULL)
{
    $process = proc_open(
      $this->getPhpBinary(),
      array(
        0 => array('pipe', 'r'),
        1 => array('pipe', 'w'),
        2 => array('pipe', 'w')
      ),
      $pipes
    );

    if (!is_resource($process)) {
        throw new PHPUnit_Framework_Exception(
          'Unable to create process for process isolation.'
        );
    }

    if ($result !== NULL) {
        $result->startTest($test);
    }

    $this->process($pipes[0], $job);
    fclose($pipes[0]);

    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    proc_close($process);
    $this->cleanup();

    if ($result !== NULL) {
        $this->processChildResult($test, $result, $stdout, $stderr);
    } else {
        return array('stdout' => $stdout, 'stderr' => $stderr);
    }
}

A linha$stdout = stream_get_contents($pipes[1]); resulta em$stdout sendo igual a uma longa seqüência de?. Em$this->processChildResult o valor em$stdout é desserializado e o valor inválido passado para essa função dispara um aviso, resultando em uma exceção sendo lançada. Eu também fui capaz de determinar que o valor de retorno de$this->getPhpBinary() é/usr/bin/php.

Mensagem de exceção lançada:

PHPUnit_Framework_Exception: ???...???"*???...??


Caused by
ErrorException: unserialize(): Error at offset 0 of 10081 bytes

Graças ao hek2mgl o código PHP em$job pode ser revisadoneste gist segurando a saída de um var_dump em $ job. Eu criei um link, pois é uma boa quantidade de código e esta questão já é bastante longa.

Cheguei ao fim do meu conhecimento para esse domínio em particular e não sei como continuar a depurar esse problema ainda mais. Eu não tenho certeza porque o@runInSeparateProcess está falhando e porque o$stdout de executar um processo separado resulta em uma longa seqüência de caracteres? marcas. O que pode estar causando esse problema e como posso resolvê-lo? Estou paralisado por este módulo, pois testes futuros exigirão a execução em um processo separado para garantir que as sessões iniciadas e destruídas não afetem os testes.

PHP: 5.3.15PHPUnit: 3.7.5Erro causado em corredores de teste de linha de comando e IDE

questionAnswers(3)

yourAnswerToTheQuestion