Error de no serialización cuando @runInSeparateProcess
Estoy implementando un módulo que proporcionará una API para trabajar y administrar sesiones de PHP. Estoy probando elSession\Manager
Implementación que permitirá a los usuarios iniciar sesiones, establecer identificaciones, obtener identificaciones, destruir sesiones, etc. Estoy probando los métodos de esta clase en un proceso separado, utilizando PHPUnit@runInSeparateProcess
anotación. Cuando uso esta anotación recibo una excepción lanzada por PHPUnit debido a un error de deserialización. Cuando no uso la anotación, la prueba se ejecuta como se esperaba y falla en nulo al no ser igual a falso.
Aquí está la prueba que causa el error. Hasta el momento no se han realizado detalles de implementación, todos los métodos para la interfaz existen pero no realizan operaciones.
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());
}
}
Pude rastrear el problema hasta el siguientePHPUnit_Util_PHP::runJob()
método. Estoy ejecutando PHPUnit 3.7.5 y elrunJob
El método invocado es:
/**
* 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);
}
}
La línea$stdout = stream_get_contents($pipes[1]);
resultados en$stdout
siendo igual a una larga cadena de?
. En$this->processChildResult
el valor en$stdout
no se ha serializado y el valor no válido que se pasa a esta función activa una advertencia, lo que genera una excepción. También he podido determinar que el valor de retorno de$this->getPhpBinary()
es/usr/bin/php
.
Mensaje de excepción lanzado:
PHPUnit_Framework_Exception: ???...???"*???...??
Caused by
ErrorException: unserialize(): Error at offset 0 of 10081 bytes
Gracias a hek2mgl el código PHP en$job
puede ser revisadoen esta esencia, sosteniendo la salida de un var_dump en $ trabajo. Creé un enlace ya que es una buena cantidad de código y esta pregunta ya es bastante larga.
Llegué al final de mi conocimiento para este dominio en particular y no estoy seguro de cómo solucionar este problema aún más. No estoy seguro de por qué el@runInSeparateProcess
está fallando y por qué la$stdout
de ejecutar un proceso separado resulta en una larga cadena de? marcas. ¿Qué podría estar causando este problema y cómo podría resolverlo? Estoy paralizado para este módulo, ya que las futuras pruebas requerirán ejecutarse en un proceso separado para asegurar que las sesiones que se inician y destruyan no afecten las pruebas.