2012-03-16 14 views
8

Comencé a escribir las pruebas de unidades Doctrine 2 Mongo ODM pero me di cuenta de que no tenía una buena estrategia en mi código para hacer esto. Quiero ejecutar las pruebas y realmente conservar los objetos, pero luego quiero permitir que mis datos de prueba se eliminen fácilmente en tearDown. Los nombres de colecciones y bases de datos deben especificarse a partir de lo que he visto en las anotaciones y no pueden anularse, así que no puedo simplemente crear un banco de pruebas de prueba y borrarlo más tarde.Doctrina de prueba de unidades ODM

¿Alguien tiene mejores prácticas o ejemplos de lo que ellos piensan que son las mejores formas de evaluar?

+0

Cualquier punteros a las mejores prácticas para la forma en que debería estar probando los modelos que se conservan por Doctrina ODM será apreciado. No parece haber mucho para modelar después. –

Respuesta

10

No tiene que persistir en sus objetos. La buena forma es usar simulacro para verificar si su objeto persistió. Te daré un ejemplo. Digamos que usted tiene una clase:

class SomeSerivce 
{ 
    private $dm; 

    public function __construct(DocumentManager $dm) 
    { 
     $this->dm = $dm; 
    } 

    public function doSomeMagic($someDocument, $someValue) 
    { 
     $someDocument->setSomeValue($someValue); 
     $this->dm->persist($someDocument); 
     $this->dm->flush(); 
    } 
} 

Ahora, usted no va a comprobar si un documento fue realmente persistió porque esto se pone a prueba en algún código de identificación Doctrina. Puede suponer que los métodos persist y flush funcionan bien. Lo que desea verificar es si su código llama a estos métodos correctamente.

Por lo tanto, la prueba podría parece:

(...) 
public function testDoSomeMagic() 
{ 
    $documment = new Document(); 

    // preapre expected object 
    $expectedValue = 123; 
    $expectedDocument = new Document(); 
    $expectedDocument->setValue($expectedValue); 

    // prepare mock 
    $dmMock = $this->getMockBuilder('DocumentManager') 
     ->setMethods(array('persist', 'flush')) 
     ->disableOriginalConstructor() 
     ->getMock(); 
    $dmMock->expects($this->once()) 
     ->method('persist'); 
     ->with($this->equalTo($expectedDocument)); 
    $dmMock->expects($this->once()) 
     ->method('flush'); 

    // new we start testing with the mock 
    $someService = new SomeService($dmMock); 
    $someService->doSomeMagic($document, $expectedValue); 
} 
+1

Se vuelve mucho más complicado una vez que comienza a agregar en queryBuilders. Sugerencias? –

Cuestiones relacionadas