使用DrupalUnitTestCase的单元测试Drupal在数据库设置时失败

时间:2011-05-18 13:11:35

标签: unit-testing drupal simpletest

使用DrupalUnitTestCase对Drupal模块进行单元测试失败。我可能会忘记一些事情。

测试运行良好,直到我创建了一个类的实例:

$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在其注册表中查找文件?

2 个答案:

答案 0 :(得分:4)

你可能不会。

使用UnitTestCase作为父类的可能性非常有限。只要您执行任何需要数据库的操作(并且因为Drupal 7的自动加载功能依赖于数据库而创建新类),就必须使用WebTestCase。

唯一可行的方法是明确包含该类所需的所有文件。因为只有当类不存在时才调用自动加载(也可以是您的类使用或依赖的类)。但这是相对脆弱的,您将始终必须以正确的顺序手动包含所有这些文件,这意味着您的单元测试取决于您的类的内部工作。哪个也不好。

答案 1 :(得分: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自动加载移到底部并解决问题。