Before_save y test

Hola a todos

Primero quiero saludar al foro puesto que es mi primer mensaje.

Una vez presentado :), quisiera preguntaros un asunto relacionado con
los test en rails (Sí, aquí hay uno que ha empezado a hacer tests).

Tengo un modelo llamado User en el que he utilizado before_save para
cifrar la clave del usuario antes de guardarlo:

class User < ActiveRecord::Base
[…]
before_save :encrypt_password
[…]
protected

def encrypt_password
  if !password.blank?
    self.hashed_password = User.hash_password(password)
  end
end

[…]
end

He empezado a hacer un test, y me gustaría probar que el modelo realiza
el cambio de clave del usuario correctamente. En uno de los test tengo
lo siguiente:

def test_password_management
[…]
@user.password = “newpw”
@user.password_confirmation = “newpw”
assert(@user.valid?)
end

Este assert lo que comprueba es que el usuario ha pasado correctamente
las validaciones. Pero también me gustaría es comprobar que hace el
cifrado de la nueva clave. Tendría que ser algo así.

[…]
assert_equal(@user.hashed_password,“95c4c0b728c563a1ddab068ea2166e983eedd528”)
[…]

Pero este assert solo será valido si hago un @user.save, el caso es que
creo que en una versión anterior de rails se utilizaba transacciones
entre los diferentes test, pero que por cuestiones de rendimiento ya no
es así. Si salvo los datos a la base de datos, entonces podría llegar a
tener unos tests que sean dependientes de otros y del orden en que se
ejecuten.

No se muy bien como debería hacer esta comprobación. He probado a hacer
un @user.before_save, pero no ha resultado. Alguna idea sería agradecida
:slight_smile:

Me ha quedado un poco largo, gracias por adelantado.

saludotes

David Flores wrote:

Si salvo los datos a la base de datos, entonces podría llegar a
tener unos tests que sean dependientes de otros y del orden en que se
ejecuten

Para realizar pruebas utilizaremos la base de datos destinada para esto,
por ejemplo si tenemos una base de datos que se llame mydb_development,
tendremos una para pruebas llamada mydb_test. Una alternativa es clonar
la estructura de la base de datos, sería con rake:

rake clone_structure_to_test

Ahora bien, ya tenemos nuestra base de datos de pruebas con el mismo
schema que la que empleamos para desarrollo, pero sin datos. Para
realizar pruebas podemos emplear “Test Fixtures”, es una especificación
del contenido inicial de un modelo, de este modo nos aseguramos que
nuestra tabla users por ejemplo inicie con el correcto contenido al
inicio de cada prueba unitaria. Los datos “fixture” se localizan en
archivos en la carpeta test/fixtures. Esos archivos contienen datos en
formato CSV (Valores separados por coma) ó bien en el formato YAML. Si
nuestro modelo se llama User, entonces deberemos tener un archivo
llamado users.yml, con un contenido semejante al siguiente :

david:
id: 1
login: david
email: [email protected]
crypted_password: 00742970dc9e6319f8019fd54864d3ea740f04b1 # test
dhh:
id: 2
login: dhh
email: [email protected]
crypted_password: 00742970dc9e6319f8019fd54864d3ea740f04b1 # test

Te dejo estos links:

http://wiki.rubyonrails.com/rails/pages/ActiveRecordYamlFixtures
http://wiki.rubyonrails.com/rails/pages/HowToUseFixturesWithHABTM
http://manuals.rubyonrails.com/read/chapter/26
http://rails.rubyonrails.com/classes/Fixtures.html

Espero te sirva.

Jaime Mora R.