2012-02-21 11 views
6

Al utilizar PHPUnit para probar una clase que se basa en la base de datos, el método getDataSet() proporciona datos para servir como el accesorio de prueba para todo el conjunto de pruebas. Eso es genial, pero ¿cómo se proporcionan datos para una prueba específica? No es inusual, especialmente cuando se utilizan conjuntos de datos minimizados, que cada prueba requiera datos de bases de datos diferentes además de los datos comunes que utilizan todas las pruebas. Sé que el objeto PDO está disponible, y en nuestro caso, el objeto DB nativo de la aplicación también está disponible (es decir, podemos ejecutar consultas crudas o usar otras funcionalidades en la aplicación), pero sería bueno tener una forma de insertar datos eso se eliminó de los contenedores DataSet de PHPUnit para que todos los datos de prueba se manejen de la misma manera para una mayor claridad y un mantenimiento más fácil.Cómo insertar filas de bases de datos de casos de prueba específicos con PHPUnit

¿Hay alguna manera de lograr esto?

Respuesta

4

es una respuesta tardía pero aún podría ser útil para algunas personas, supongo ...

Puede lograr esto llamando al método execute de IDatabaseOperation que puede obtener desde PHPUnit_Extensions_Database_Operation_Factory. Básicamente usaría CLEAN_INSERT o INSERT.

Como zerkms' second approach, lo llamaría al comienzo de cada prueba que necesita datos específicos. Por ejemplo:

public function testA() { 
    PHPUnit_Extensions_Database_Operation_Factory::INSERT() 
    ->execute($this->getConnection(), $this->createXMLDataSet(__DIR__.'/fixtureA.xml')); 

    // Test code 
} 

Sin embargo, la ventaja de esta solución es que el conjunto de datos de todo el caso de prueba se mantiene sin cambios, por lo que:

  • Métodos de ensayo permanecen independiente el uno del otro (mientras En el enfoque de zerkms, si no olvida/olvida especificar un conjunto de datos en otro método de prueba, reutilizaría el conjunto de datos del método anterior (¿aleatorio?) que cambió el conjunto de datos, que es bastante feo y propenso a errores en mi humilde opinión. . Aquí, cualquier otra prueba sin esa llamada al principio solo usaría el conjunto de datos de casos de prueba como de costumbre.
  • Puede construir su conjunto de datos de prueba sobre el conjunto de datos común (caso de prueba). Si usa la operación INSERT (no CLEAN_INSERT), insertará filas específicas para la prueba después de todas las filas del conjunto de datos común. También puede usar la operación DELETE para eliminar algunas filas no deseadas de ese conjunto de datos común.
  • BTW, sin llamar al onSetUp() hace que esto funcione incluso si se ha cambiado la operación de configuración de la carcasa de prueba.
8

Se podría seguir tal mala pasada:

protected function getDataSet() 
{ 
    if (in_array($this->getName(), array('testA', 'testB', '...'))) { 
     return $this->createXMLDataSet(__DIR__ . '/_fixtures/fistureA.xml'); 
    } 

    return $this->createXMLDataSet(__DIR__ . '/_fixtures/fixtureB.xml'); 
} 

pequeña nota: $this->getName() devuelve el actual método de prueba

Un enfoque alternativo es volver a ejecutar se instaló en el inicio de la prueba:

public function testA() 
{ 
    $this->getDatabaseTester()->setDataSet($this->createFlatXMLDataSet(__DIR__ . '/_fixtures/fixtureForTestA.xml')); 
    $this->getDatabaseTester()->onSetUp(); 

    /* your test code */ 
} 
+0

Creo que fue mucho más simple con versiones anteriores. ¿Por qué lo complicaron? – eddy147

+0

@ eddy147: Es la única versión que he visto en dbunit – zerkms

+0

no debería usar dbunit en absoluto y escribir mis propios conjuntos de datos de preparación personalizados por el aspecto de ello – eddy147

Cuestiones relacionadas