2011-05-18 16 views
5

Al utilizar DrupalUnitTestCase al probar la unidad de un módulo Drupal, falla. Probablemente me olvide algo.Prueba de la unidad Drupal con DrupalUnitTestCase falla en la configuración de la base de datos

La prueba se ejecuta bien hasta puedo crear una instancia de una clase:

$foo = new FooBar(); 

En ese caso, Drupal decide hacer un poco de magia y los intentos de llamar a la base de datos, con el fin de encontrar algún archivo en su registro .

Test PDOStatement->execute() failed: <em class="placeholder">PDOException</em>: SQLSTATE[42S02]: Base table [error] 
or view not found: 1146 Table &#039;td_development.simpletest50921registry&#039; doesn&#039;t exist: SELECT 
filename FROM {registry} WHERE name = :name AND type = :type; Array 
(
    [:name] =&gt; FooBar 
    [:type] =&gt; interface 
) 

DrupalUnitTestCase, en contraposición a DrupalWebTestCase no configura una base de datos, por diseño. Entonces la razón por la cual esto falla es clara.

Sin embargo, no quiero que Drupal vaya a buscar en una base de datos cuando todo lo que quiero es crear alguna instancia. ¿Cómo evitar que Drupal busque el archivo en su registro?

+0

Para esas almas perdidas como yo, este caso de uso/error se aplica (tristemente) a ENTIDADES y CONTROLADORES DE ENTIDAD también. Etiquetado para el beneficio de la interwebz. También se agregó información relevante a la respuesta aceptada (@Berdir). –

Respuesta

4

Probablemente no pueda.

Las posibilidades de utilizar UnitTestCase como clase principal son muy limited. Tan pronto como haga algo que requiera la base de datos (y la creación de una nueva clase sí lo hace porque las funciones de autocarga de Drupal 7 dependen de la base de datos), debe usar WebTestCase.

Lo único que podría funcionar es incluir explícitamente todos los archivos necesarios para que esa clase funcione. Porque solo se llama a la carga automática si la clase todavía no existe (también podría ser una clase de la que su clase usa o depende). Pero eso es relativamente frágil y siempre tendrá que incluir todos estos archivos de forma manual en el orden correcto, lo que significa que las pruebas de su unidad dependen del funcionamiento interno de su clase. Lo cual tampoco es bueno.

+0

Al incluirlo manualmente en setUp(), Drupal ya no necesita una base de datos para crear una intancia. Sin embargo, falla un poco más abajo con una 'DatabaseConnectionNotDefinedException'. Supongo que simplemente se reduce a "no usar pruebas unitarias, use webtest en su lugar". Gracias. – berkes

0

También puede probar este

spl_autoload_register('your_function'); 
if (function_exists('drupal_autoload_class')) { 
    spl_autoload_unregister('drupal_autoload_class'); 
    spl_autoload_register('drupal_autoload_class'); 
    spl_autoload_unregister('drupal_autoload_interface'); 
    spl_autoload_register('drupal_autoload_interface'); 
} 

Esto moverá la carga automática de Drupal hasta el fondo y resolver el problema.

Cuestiones relacionadas