SimpleTest 参考

原文链接http://drupal.org/node/278126

本文如下给出了有关Drupal测试的其他资源。详细内容请阅读相关的链接页。

关于以前版本的SimpleTest的信息,其文档中提及的钩子函数、方法和函数在本版本的SImpleTest中已经不使用。

SimpleTest PHP库 (基于Drupal SimpleTest模块)。

API函数

原文链接http://drupal.org/node/265762

内部浏览器

DrupalWebTestCase设有一个内部浏览器,用作测试网站上的浏览。更多信息请阅读有关WebTestCase类的基础文档。

function $this->drupalGet($path, $options = array())

该函数向Drupal页面提出GET请求。
其中,$PATH指要访问的页面的路径,$options给出可能需要提供给要访问页面路径的url()函数的其他一些数据。加载后的内容,会存储到$this->_content 中(和返回一样),可通过this->drupalGetContent()函数来获取内容

请参加API文档来了解更多的url()函数(http://api.drupal.org/api/function/url)中如何构造$option关联数组的信息。

function $this->drupalPost($path, $edit, $submit, array $options = array(), array $headers = array())

该函数向Drupal页面提出post请求。

  • $path表示页面中含有的表单,显示$edit中的数据;
  • $option值传递给url(),以便建立$path的路径;
  • $sumbit用于发送按钮的点击(submit显示标题有该方法解释传递)
  • 表示HTTP表头的$head为POST操作的可选参数;
  • $edit数据应该是一组数组,其中索引值为HTML表单元素的"名字"属性值。可以通过像firebug这样的插件来获得该值。

该函数也判断请求是否成功,表单字段从而可以设置。

举例说明:

<?php
$name
= $this->randomName();
$mail = "$name@example.com";
$edit = array(
 
'name' => $name,
 
'mail' => $mail,
 
'status' => FALSE, // checkboxes must be set with TRUE/FALSE rather than 1/0
);
$this->drupalPost('user/register', $edit, 'Create new account');
?>

注意:这里调用的是是drupalPostRequest()。

对于多步骤表单,可以通过赋$path以$NULL值,从而使连续post表单成为可能。

function $this->clickLink($label, $index = 0)
该函数给出当前页面名字的链接。链接路径有第一个默认链接文本,或者后面的$index给出。

举例如下:

<?php
$this
->clickLink(t('Log out'));
?>
function $this->drupalCreateUser($permissions = NULL)

该函数创建用户,并返回含有pass_raw值的用户对象,该pass_raw参数含non-hashed密码。

该函数通过给返回用户对象定义$permissions来创建权限。

$permissions为一组字符串数组。如果忽略还参数或者赋值NULL,那么注册用户权限则使用默认权限,

array('access comments', 'access content', 'post comments', 'post comments without approval')

结果会对成功做判断,同时清理用户和权限表。

function $this->drupalLogin($user = NULL)

该函数产生用户登陆网页后日志。只需对$user参数操作(需要给出pass_raw值)。

如果忽略参数,则用上述提到的默认权限来产生用户和其权限。

用户登陆后,就看用内置浏览器来浏览了。

举例如下:

<?php
// Prepare a user to do the stuff
$user = $this->drupalCreateUser(array('access content', 'create page content'));
$this->drupalLogin($user);

// Now do something with the users
$this->drupalGet('node/' . $node->nid));
?>

上述例子也对登陆过程做了几个判断。

function $this->drupalLogout()

该函数执行退出当前登陆。因为该函数通过$this->drupalLogin($user = NULL)自动调用的,所以要切换到另一个用户时,是不需要调用这个函数的。除非想退出当前登陆,切换到匿名登陆是才需要调用它。

举例如下:

<?php
// Prepare a Drupal user to retrieve a page
$user = $this->drupalCreateUser(array('access content', 'create page content'));
$this->drupalLogin($user);
$test_page = 'node/' . $node->nid;

// Retrieve page as the logged in user
$this->drupalGet($test_page);
$this->assertText(t('Welcome'), t('Check that a welcome message is set'));

// Logout and retrieve the page as an anonymous user
$this->drupalLogout();
$this->drupalGet($test_page);
$this->assertText(t('Please login'), t('Check that user is prompted to login'));
?>

注意:上例中需要退出,因为浏览器上已经有登陆会话了。如果你没有登陆一直以匿名用户在浏览网页,当然不需要退出。

function $this->_drupalCreateRole($permissions = NULL)

该函数很少用。$permission参数用法和drupalCreateUser一样。

返回值是整型role-id,或者失败时以FALSE返回。

function $this->randomString($number = 8)

该函数返回$number参数唯一前缀字符串。该字符串为32到126之间的ASCII字符串。第一位字符不能为数字。

function $this->randomName($number = 8)

返回$number的唯一前缀字母字符串,第一个字母不能为数字。

function $this->drupalCreateContentType($settings)

该函数产生基于默认配置的自定义内容类型。节点的默认值已经设好,可以选择覆盖它们(或者通过$settings关联数字添加新的数值)。

举例如下:

<?php
$settings
= array(
 
'type' => 'my_special_node_type', // Override default type (a random name)
 
'title_label' => 'Name', // Override default title label ("Title")
 
'body_label' => 'Description', // Override default body label ("Body")
);
$content_type = $this->drupalCreateContentType($settings);

$this->assertEqual($content_type->type, 'my_special_node_type'); // We set this.
?>
function $this->drupalCreateNode($settings)

该函数产生一个节点。节点的默认值已经设置好,可以选择覆盖它们(或者通过$settings关联数字添加新的数值)。

举例如下:

<?php
$settings
= array(
 
'type' => 'my_special_node_type', // This replaces the default type
 
'my_special_field' => 'glark', // This appends a new field.
);
$node = $this->drupalCreateNode($settings);

$this->assertEqual($node->type, 'my_special_node_type'); // We set this.
$this->assertEqual($node->comment, 2); // This is default.
?>

默认设置如下所示:

<?php
   
// Populate defaults array
   
$defaults = array(
     
'body'      => $this->randomName(32),
     
'title'     => $this->randomName(8),
     
'comment'   => 2,
     
'changed'   => time(),
     
'format'    => FILTER_FORMAT_DEFAULT,
     
'moderate'  => 0,
     
'promote'   => 0,
     
'revision'  => 1,
     
'log'       => '',
     
'status'    => 1,
     
'sticky'    => 0,
     
'type'      => 'page',
     
'revisions' => NULL,
     
'taxonomy'  => NULL,
    );
   
$defaults['teaser'] = $defaults['body'];
   
// If we already have a node, we use the original node's created time, and this
   
if (isset($defaults['created'])) {
     
$defaults['date'] = format_date($defaults['created'], 'custom', 'Y-m-d H:i:s O');
    }
    if (empty(
$settings['uid'])) {
      global
$user;
     
$defaults['uid'] = $user->uid;
    }
?>
function $this->cronRun()

该函数实现SimpleTest中Drupal安装的cron功能。千万不要直接调用drupal_run_cron。在Simple Test6.x中不存在这个方法。