Hello SimpleTest

Este es un ejemplo trivial donde uso SimpleTest para comprobar el módulo HelloWorld.

Entorno
Procedimiento

Tengo creado el módulo HelloWorld:

helloworld.info
; $Id$
name = Hello World
description = Hello World simple module
core = 6.x
package = Hello

helloworld.module
<?php
// $Id$
/**
 * Implementation of hook_menu()
 */
function helloworld_menu() {
  $items = array();
  
  $items['helloworld'] = array(
    'title' => 'Hello World',
    'page callback' => 'helloworld_page',
    'access arguments' => array('access helloworld content'),
    'type' => MENU_NORMAL_ITEM,
  );
  
  return $items;
}

/**
 * Return content
 */
function helloworld_page() {
  $greeting = variable_get('helloworld_greeting', 'Hello World!');
  
  $content = '<div id="helloworld_block"><div class="greeting">' .
    $greeting . '</div></div>';
    
  return $content;
}

helloworld.test
<?php
// $Id$
class HelloWorldTestCase extends DrupalWebTestCase {
  protected $privileged_user;
  
  public static function getInfo() {
    return array(
      'name' => 'Hello World',
      'description' => 'Hello World simple module.',
      'group' => 'Hello',
    );
  }
  
  public function setUp() {
    parent::setUp('helloworld');
  }
  
  public function testHelloPage() {
    $this->drupalGet('helloworld');
    $this->assertText('Hello World!', 'Greeting in Page');
  }
  • La intención de la prueba es acceder a la dirección helloworld y comprobar que aparezca el texto 'Hello World!'.
  • La clase HelloWorldTestCase extiende a DrupalWebTestCase, que permite imitar una navegación.
  • getInfo() hace que el case sea accesible desde la interface de SimpleTest.
  • setUp() permite definir el entorno inicial para las prueba. Por ejemplo hay órdenes para crear usuarios y simular logins. En este caso, no se hace nada de eso, sólo lo mínimo.
  • El nombre del método de la prueba comienza con test, luego el nombre de la prueba.
  • drupalGet(url) permite simular un acceso a la página de url especificado.
  • assertText() comprueba si el el texto especificado está presente en la página abierta. Sólo el texto; el HTML es ignorado. Opcionalmente se puede asociar un mensaje a la prueba.
  • En tutoriales como http://www.lullabot.com/articles/drupal-module-developer-guide-simpletest aparece un paso donde se implementa hook_simpletest(). Sin embargo, en el tutorial oficial http://drupal.org/node/890654 no aparece este paso. Yo tampoco lo he puesto aquí. No sé si será necesario en otros casos.
    Tampoco fué necesario que creara un directorio test. Coloqué helloworld.test en el mismo directorio que helloworld.module.
Para correr la prueba se usa el administrador de Drupal, Site Building, Testing, Hello (el nombre del grupo de pruebas que especifiqué con getInfo()) y HelloWorld (el nombre del case).


En este caso aparecerá un fail en la línea del assertText. Tambiém puede comprobar manualmente que al intentar acceder a la página helloworld aparece un mensaje de acceso denegado.

Es porque en la definición de la página he indicado privilegios de acceso que no existen. Para corregir esto:

function helloworld_menu() {
  $items = array();
  
  $items['helloworld'] = array(
    'title' => 'Hello World',
    'page callback' => 'helloworld_page',
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
  );
  
  return $items;
}


Como he modificado el módulo, limpio el cache antes de volver a correr la prueba. Aparecerá todo OK.

Enlaces interesantes

Comentarios

Entradas populares de este blog

Debug con Xdebug y Aptana (y Notepad++)

Drupal sí, drupal no

CSS3 para mejorar el breadcrumb de un tema Zen