2012-10-10 50 views
5

Tengo un problema con mi Entity Manager en phpunit.Problema con Entity Manager y phpunit en Symfony 2

Esta es mi prueba:

public function testValidChangeEmail() 
{ 
    $client = self::createAuthClient('user','password'); 

    $crawler = $client->request('GET', '/user/edit/30'); 
    $crawler = $client->submit($crawler->selectButton('submit')->form(array(
     'form[email]' => '[email protected]', 
    ))); 

    /* 
    * With this em, this work perfectly 
    * $em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
    */ 

    $user = self::$em->getRepository('MyBundle:User')->findUser('[email protected]'); 

    die(var_dump($user->getEmail())); 
} 

y este es mi WebTestCase que se extiende WebTestCase el original:

class WebTestCase extends BaseWebTestCase 
{ 
    static protected $container; 
    static protected $em; 

    static protected function createClient(array $options = array(), array $server = array()) 
    { 
     $client = parent::createClient($options, $server); 
     self::$em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
     self::$container = $client->getContainer(); 

     return $client; 
    } 

    protected function createAuthClient($user, $pass) 
    { 
     return self::createClient(array(), array(
      'PHP_AUTH_USER' => $user, 
      'PHP_AUTH_PW' => $pass, 
     )); 
    } 

Como se puede ver, puedo reemplazar el self :: $ em cuando creé mi cliente.

Mi problema:

En mi prueba, el die() Dame la edad de correo electrónico y no el nuevo correo electrónico ([email protected]) que ha registrado en la prueba. Sin embargo, en mi base de datos, guardo correctamente el [email protected].

Cuando recupero mi usuario en la base de datos, uso sefl::$em. Si utilizo el $em en los comentarios, recupero el nuevo correo electrónico correcto.

No entiendo por qué en mi WebTestCase, puedo tener acceso a la nueva Gerente de la Entidad ...

+0

Nota al margen: ¿Por qué en la tierra no se muere (var_dump()), ni hacer var_dump devolver nada útil, ni en caso de necesitar a morir() en el medio de una prueba. – conny

Respuesta

4

No se puede acceder al nuevo gestor de la entidad debido núcleo de clientes de apagado clase de Symfony antes de cada solicitud, la cual significa que borra todo el contenedor de servicio y lo vuelve a construir desde cero.

Por lo tanto, después de SEGUNDA solicitud obtiene un administrador de entidades muy diferente del que tiene en su propia clase WebTestCase. (Dije después de segundo porque el kernel de apagado del cliente solo si ya se realizó alguna solicitud)

La pregunta es: ¿realmente necesitas el mismo administrador de entidades en tu clase WebTestCase? En realidad, puede usar el mismo administrador de entidades porque quiere, por ejemplo, tener control sobre las transacciones entre las solicitudes. Pero en este caso debe crear su propia clase de cliente de prueba extendida de Symfony y definir la conexión estática o el administrador de entidades, y ponerlo en el contenedor antes de cada solicitud.

Mire ejemplo: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

+0

Muchas gracias por su valiosa respuesta. En este caso, solo quiero probar si el formulario guardó el nuevo correo electrónico en la base de datos. Entonces, ¿quieres lo mejor en tu opinión? ¿Crear mi propio cliente de prueba para poner el administrador y el contenedor de entidades antes de cada solicitud? Gracias por su ayuda, ¡continuaré trabajando correctamente! – rgazelot

+2

Si solo quieres comprobar si se agregó algo correctamente, ¿por qué no utilizas el administrador de entidades del cliente predeterminado (de la forma en que lo hiciste en tu fragmento comentado)? No veo ninguna necesidad de mantener la instancia del administrador de la entidad. Utilizo mi propio cliente de prueba en una situación en la que deseo, por ejemplo, verificar si se agregó una nueva fila a db Y luego revertir la transacción (porque no quiero que mi prueba modifique la base de datos). – Cyprian

+0

Ok. Ya veo. Gracias por tu ayuda. Trataré de implementar esto rápidamente. – rgazelot