Drupal 6最简单的两个初学者错误

Simpletest是一个Drupal模块,我已经使用了大约一周的时间来对我一直在研究的模块进行单元测试。这是一个出色而强大的模块,每个模块开发人员都应使用该模块来正确测试其代码。但是,我确实遇到了一些奇怪的错误,这些错误花了我一段时间才能解决。因此,为了其他所有人的利益,我想将它们和解决方案一起发布在这里。这些错误可能是Drupal Simpletest新手开发人员会遇到的事情,这就是为什么我将它们标记为初学者错误。

第一个绝对是个错误,对于刚刚开始使用该模块的每个人来说,它都不是立即显而易见的。发生的情况是,当您尝试对核心数据库表甚至模块外部的表执行任何操作时,将尝试运行一些测试,并且会看到“表不存在”错误出现。在花了一个小时浏览drupal.org网站上的所有Drupal Simpletest文档之后,我对所发生的事情一无所知。

/**
 * Test case for Drupal unit tests.
 *
 * These tests can not access the database nor files. Calling any Drupal
 * function that needs the database will throw exceptions. These include
 * watchdog(), function_exists(), module_implements(),
 * module_invoke_all() etc.
 */
class DrupalUnitTestCase extends DrupalTestCase {

发生此错误的原因是,在创建Drupal Simpletest测试类时,您将扩展两个父类之一。这些是DrupalWebTestCase和DrupalUnitTestCase。发生表错误的原因是因为您可能正在使用DrupalUnitTestCase类对核心表进行操作。快速浏览一下DrupalUnitTestCase类的定义即可了解正在发生的事情。

从此注释(和构造函数)可以清楚地看到,此类初始化时没有数据库交互发生。您编写的测试类正在尝试访问尚未设置的测试表,更改类定义以扩展DrupalWebTestCase(如下所示)将解决此问题。

class MyAmazingModule_Test extends DrupalWebTestCase {
}

这样做的原因是DrupalUnitTestCase类仅应用于测试不需要数据库或文件级访问的事物。这些就是字符串操作或计算之类的东西。测试其他所有内容时,应使用DrupalWebTestCase类。

我遇到的第二个问题是,每当我尝试运行测试时,都会显示以下错误:

An error occurred. /batch?id=21&op=do
Fatal error: Call to undefined function install_no_profile_error() in /www/includes/install.inc</b> on line 277

深入研究核心代码并没有多大帮助,相关的代码行似乎与任何事情都没有多大关系,并且该函数install_no_profile_error()确实存在。我最终发现是由于Drupal Simpletest启动时使用默认注入配置文件创建的虚拟数据库所致,该虚拟数据库将用于每次运行的测试。在此特定实例中,已使用Acquia设置了Drupal,并且由于某些原因,缺少了配置文件目录中的默认灌输配置文件。这意味着当Drupal Simpletest尝试使用此配置文件进行自身安装时,它会崩溃并打印出上面的消息。

解决此问题非常容易,只需从drupal.org站点中获取一个Drupal副本,然后将默认灌输配置文件复制到配置文件目录中即可。当您重新运行测试时,它们都应该工作。