2011-05-18 69 views
5

使用DrupalUnitTestCase单元测试Drupal模块失败。我可能会忘记一些。单元测试Drupal与DrupalUnitTestCase在数据库设置上失败

测试运行正常,直到我创造了一些类的实例:

$foo = new FooBar(); 

在这种情况下,Drupal的决定做一些魔术和试图调用数据库,以找到在注册表中的某些文件。

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,而不是DrupalWebTestCase不建立一个数据库,通过设计。所以这个失败的原因很明显。

但是,我不想让Drupal在数据库中查找所有我想要创建的实例。如何避免Drupal在注册表中查找文件?

+0

对于像我这样迷失的灵魂 - 这个用例/错误同样适用于(难过)实体和实体控制器。标记为interwebz的好处。还将相关信息添加到接受的(@Berdir)答案中。 – 2013-12-11 01:48:28

回答

4

你可能不能。

使用UnitTestCase作为父类的可能性是非常有限。只要你做了任何需要数据库的事情(并且创建一个新类,因为Drupal 7的自动加载功能依赖于数据库),你必须使用WebTestCase。

唯一可能的工作是明确包含该类所需的所有文件。因为只有在类尚不存在时才会调用自动加载(也可以是类使用或依赖的类)。但是这相对比较脆弱,你必须始终以正确的顺序手动包含所有这些文件,这意味着你的单元测试依赖于你班级的内部工作。这也不好。

+0

当在setUp()上手动包含时,Drupal确实不再需要数据库来创建实例。但是,它会因'DatabaseConnectionNotDefinedException'进一步失败。我想这简直归结为“不要使用unittests,而是使用webtests”。谢谢。 – berkes 2011-05-18 15:25:51

0

你也可以试试这个

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'); 
} 

这将Drupal的自动加载移至底部并解决问题。