ruby on rails - instalar - Pruebas funcionales con Rails y Devise. ¿Qué poner en mis accesorios?
devise user logged in (4)
Está funcionando para mí.
No cambié nada en mi dispositivo de usuario, es así:
one:
id: 1
name: MyString
email: [email protected]
group_id: 2
encrypted_password: <%= Devise.bcrypt(User, ''password'') %>
Pero cambié mi test_helper.rb
y lo agregué a la clase ActionController
(esto funcionará para todas las pruebas de controladores):
class ActionController::TestCase
include Devise::TestHelpers
setup do
sign_in users(:one)
end
end
Hola, quiero hacer algunas pruebas funcionales de mi aplicación Rails 3 que utiliza Devise y CanCan.
En mi modelo de usuario Tengo la edad de los usuarios, quiero probar que un usuario solo puede visitar una determinada página si son:
- Conectado
- Mas de 35
He visto en el documento de Devise que puedo usar: * sign_in * y lo puse en mis pruebas y parece que funciona. La prueba no produce errores porque tengo:
include Devise::TestHelpers
en mi * test_helper.rb *
Cuando lo saco, mi prueba produce un error porque * sign_in * no está definido. Así que no es un problema de ayuda.
Cuando ejecuto la prueba y compruebo si span # login tiene una aparición, la prueba falla porque hay 0 apariciones. span # login solo aparece * si user_signed_in? *
¿Qué necesito poner en mis accesorios o pruebas para crear un usuario de prueba que también sea un usuario completamente registrado (confirmado, etc.)?
Ver código:
<% if user_signed_in? %>
<span id="loggedin">User is signed in</span>
User age is <span id="age"><%= current_user.age.to_s %></span>
<% end %>
Código de prueba:
test "should get index" do
sign_in :one
get :index
assert_response :success
assert_select ''span#loggedin'', :count => 1
end
Accesorio:
one:
email: [email protected]
age: 36
Funciona bien en el desarrollo cuando inicio sesión manualmente, pero espero poder automatizarlo todo: ¡el punto de prueba realmente!
He solucionado el problema: estaba iniciando sesión incorrectamente en el usuario.
Mi prueba debería haber leído:
test "should get index" do
@user = users(:one)
sign_in @user
get :index
assert_response :success
assert_select ''span#loggedin'', :count => 1
end
Esto también funciona y elimina una línea de código:
test "should get index" do
sign_in users(:one)
get :index
assert_response :success
assert_select ''span#loggedin'', :count => 1
end
Mi comprensión de los accesorios faltaba ...
Pero volviendo a la pregunta - qué poner en accesorios:
one:
email: [email protected]
encrypted_password: $2a$10$PoBe1MvkoGJsjMVTEjKqgeBUp.xdfzWoiDjBzQhtLAj16NqIa2fOy
password_salt: $2a$10$PoBe1MvkoGJsjMVTEjKqge
reset_password_token: nil
remember_token: nil
remember_created_at: nil
sign_in_count: 1
current_sign_in_at: 2011-01-02 08:31:23
last_sign_in_at: 2011-01-02 08:31:23
current_sign_in_ip: 127.0.0.1
last_sign_in_ip: 127.0.0.1
confirmation_token: nil
confirmed_at: 2011-01-02 08:31:23
confirmation_sent_at: 2011-01-02 08:30:59
failed_attempts: 0
unlock_token: nil
locked_at: nil
authentication_token: nil
created_at: 2011-01-02 08:30:59
updated_at: 2011-01-02 08:31:23
age: 36
Ahora funciona. Si es más fácil generar un usuario en dev y pegar los datos en un dispositivo, por favor, publique.
Sólo una pista más. Esto funciono muy bien para mi:
Y parece ser una solución SECA y agradable.
Solución para Devise pre 3.2.0
Creo que esto podría ser lo que buscas:
User.new.send(:password_digest, ''password'')
Funciona cuando la sal es nula.
Y por lo tanto en tu accesorio puedes hacer esto:
one:
email: ''[email protected]''
encrypted_password: <%= User.new.send(:password_digest, ''password'') %>
Solución para versiones de Devise 3.2.0 a 3.5.0
En Devise 3.2.0, se creó un método precisamente para este propósito (actualización de @Inkling). Para estas versiones, la contraseña cifrada debe definirse así:
encrypted_password: <%= Devise.bcrypt(User, ''password'') %>
donde User
es la clase de su modelo de usuario.
Tenga en cuenta que esto solo se aplica si está utilizando el algoritmo de cifrado predeterminado (bcrypt).
Solución para versiones de Devise 3.5.1 y superiores
Como Katarzyna ha señalado: Device.bcrypt ha quedado en desuso en la versión 3.5.1. A partir de esa versión, la contraseña cifrada debe definirse así:
encrypted_password: <%= Devise::Encryptor.digest(User, ''password'') %>