Test Unitarios en Cakephp

 

cakePhp

Podreís ver que muchos de mis Posts son sobre cakephp, pero es sobre lo que estoy trabajando ahora mismo.

En este caso me gustaría Explicar como hacer un test unitario en un módelo y su importancia.
A mi me ayuda mucho. No se siempre, si mi modelo está bien hecho, también me ayuda a pensar en todas las funciones que necesito para ese modelo, en diferentes casos que puedo tener de respuesta, y no dar palos de ciego cuando algo no funciona.
Aunque al principio pueda parecer una perdida de tiempo hacer test unitarios, cuando la complegidad se mayor más los necesitaremos, y nos daremos cuenta de que nuestro rendimiento mejora.

Lo primero que deberemos hacer, es crear un fixture, vamos a poner un ejemplo simple, un modelo User con los campos id, name, email.

En el directorio tests/fixtures creamos el archivo user_fixtures.php
En este fichero siempre tendremos que tener la extructura de nuestra tabla, y datos con los que luego haremos nuestros tests.

ejemplo user_fixtures.php

class UserFixture extends CakeTestFixture {
	var $name = 'User';
	var $table = 'users';
	var $fields = array(
		'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 20, 'key' => 'primary'),
		'name' => array('type'=>'string', 'null' => false, 'default' => NULL, 'length' => 100),
		'email' => array('type'=>'string', 'null' => false, 'default' => NULL),
		'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1))
	);
	var $records = array(
		array(
		'id'  => 1,
		'name'  => 'usuario1',
		'email'  => 'usuario1@email.com'),
	var $records = array(
		array(
		'id'  => 2,
		'name'  => 'usuario2',
		'email'  => 'usuario2@email.com'),
	);
}

Una vez hecho el fixture, es momento de pensar en nuestros en un caso de test unitario, el primero que se me ocurre es buscar usuarios por su id.
Creamos en el directorio tests/models el archivo user.test.php, importante siempre en cake el nombre de los arhivos.
Ejemplo user.test.php

App::import('Model', 'user');

class UserTestCase extends CakeTestCase {
	var $user = null;
	var $fixtures = array('app.user');

	function startTest() {
		$this-=>User =& ClassRegistry::init('User');
	}
        function testuserInstance() {
		$this-=>assertTrue(is_a($this-=>User, 'User'));
	}
        function testfindUserId(){
	        // buscamos en el modelo user en la función findUserId la id 1.
		$friendid=$this-=>User-=>findUserId(1);
                // comparamos si el usuario el name de la busqueda, con usuario1, que debería ser true.
		$this-=>assertEqual($friendid['User']['name'],'usuario1');
	}
}

Ya tenemos Hecho un test unitario para el modelo User, ahora mismo esto nos dará Error, debemos crear la funcion findUserId() en el modelos user, aún así nos dará error, hay que hacer que esta función nuestro return sea el usuario 1 que es lo que estamos buscando.
Por cierto para poder hacer test en Cakephp debemos tener el debug del core.php a 2.

Componente cakePhp generador de Contraseña aleatorio.

 

cakePhp

Es un componente muy sencillo, pero útil para el típico “he olvidado mi contraseña” en un sistema de usuarios.

Implementación en cake

– en”controller/components” en tu proyecto de cakePhp, añadir un archivo “password.php”.

 class PasswordComponent extends Object {

/**
 * Password generator function
 *
 */
    function generatePassword ($length = 8)
    {
        // inicializa variables
        $password = "";
        $i = 0;
        $possible = "0123456789bcdfghjkmnpqrstvwxyz"; 

        // agrega random
        while ($i < $length) {

            $char = substr($possible, mt_rand(0, strlen($possible)-1), 1);

            if (!strstr($password, $char)) {
                $password .= $char;
                $i++;
            }
        }
        return $password;
    }
}

– En el controlador que vayamos a usar este componente deberemos añadir:
var $components = array(‘Password’);

– Llamaremos a la función:
$this->Password->generatePassword();

– Si guardamos la función en una variable $newpassword, tendremos la nueva password aleatoria.