2010-11-27 9 views
6

Quiero escribir una prueba de integración de rieles (con ActionDispatch::IntegrationTest). Estoy usando un dispositivo para autenticación y maquinista para modelos de prueba. No puedo iniciar sesión con éxito enPrueba de integración de rieles con la gema del ingenio

Aquí está un ejemplo sencillo:.

class UserFlowsTest < ActionDispatch::IntegrationTest 
    setup do 
    User.make 
    end 
    test "sign in to the site" 
    # sign in 
    post_via_redirect 'users/sign_in', :email => '[email protected]', :password => 'qwerty'  
    p flash 
    p User.all 
end 

Aquí es el resultado de la depuración:

Loaded suite test/integration/user_flows_test 
Started 
{:alert=>"Invalid email or password."} 
[#<User id: 980190962, email: "", encrypted_password: "", password_salt: "", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2010-11-27 16:44:10", updated_at: "2010-11-27 16:44:10">, #<User id: 980190963, email: "[email protected]", encrypted_password: "$2a$10$vYSpjIfAd.Irl6eFvhJL0uAwp4qniv5gVl4O.Hnw/BUR...", password_salt: "$2a$10$vYSpjIfAd.Irl6eFvhJL0u", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2010-11-27 17:09:13", updated_at: "2010-11-27 17:09:13">] 
"/unauthenticated" 
F 

Aquí es mi blueprints.rb:

require 'machinist/active_record' 
require 'sham' 

User.blueprint do 
    email {"[email protected]"} 
    password {"qwerty"} 
end 
+0

Recientemente he comenzado a leer Rails Test Prescriptions (http://pragprog.com/titles/nrtest/rails-test-prescriptions). Bastante temprano en el libro, Noel menciona que usará Devise para la autenticación. Salté a github.com para ver su aplicación de muestra (https://github.com/noelrappin/huddle) para ver si él resuelve este problema. Si bien no presenta ninguna prueba de integración, la publico aquí como referencia. – hiwaylon

+0

También he cambiado (volver) a utilizar AuthLogic (https://github.com/binarylogic/authlogic) para la autenticación en mi aplicación. Lo he usado antes y me gusta mucho mejor que Devise. – hiwaylon

Respuesta

2

No tengo una prueba de integración de muestra en el libro para Devise, pero creo que el código en la definición de paso en Cucumbe r capítulo también funcionará si tiene instalado Webrat/Carpincho:

@user = User.create!(:email => "[email protected]", 
      :password => "password", 
      :password_confirmation => "password") 
visit "login" 
fill_in("user_email", :with => @user.email) 
fill_in("user_password", :with => "password") 
click_button("Sign In") 
+0

Gracias por su respuesta. Tendré que desenterrar ese proyecto nuevamente y ver cómo funciona esto. +1 por ahora.Además, gracias por la buena lectura :) – hiwaylon

8

En primer lugar, con el legado, puede que tenga que "confirmar" el usuario.

se puede hacer algo como esto:

user = User.make! 
user.confirmed_at = Time.now 
user.save! 

Aquí está un ejemplo sin maquinista (pero sólo hay que reemplazar la porción código de creación de usuario con la parte de arriba):

en test_integration_helper:

require "test_helper" 
require "capybara/rails" 

    module ActionController 
     class IntegrationTest 
     include Capybara 

     def sign_in_as(user, password) 
      user = User.create(:password => password, :password_confirmation => password, :email => user) 
      user.confirmed_at = Time.now 
      user.save! 
      visit '/' 
      click_link_or_button('Log in') 
      fill_in 'Email', :with => user.email 
      fill_in 'Password', :with => password 
      click_link_or_button('Sign in') 
      user  
     end 
     def sign_out 
      click_link_or_button('Log Out') 
     end 
     end 
    end 

Y en su integration_test:

require 'test_integration_helper' 

class UsersIntegrationTest < ActionController::IntegrationTest 

    test "sign in and then sign out" do 
    #this helper method is into the test_integration_helper file     
    sign_in_as("[email protected]", "monkey")   
    assert page.has_content?('Signed in successfully'), "Signed in successfully" 

    sign_out   
    assert page.has_content?('Signed out successfully'), "Signed out successfully" 
    end 
end 
+0

Gracias por su respuesta. Tendré que desenterrar ese proyecto nuevamente y ver cómo funciona esto. +1 por ahora. – hiwaylon

1

En caso de que alguien más tiene un problema similar ...

yo estaba en una situación similar (la migración de Authlogic), y tenía este mismo problema. El problema estaba en el inicializador de. De forma predeterminada, configura su entorno de prueba para usar solo 1 extensión durante el cifrado/descifrado de las contraseñas. Honestamente, no sé lo que es un tramo, pero para Devise para trabajar con contraseñas encriptadas de Authlogic antiguas, el tramo tiene que ser 20. Como estaba tratando de iniciar sesión en un usuario que originalmente tenía su contraseña encriptada por Authlogic en mi prueba, Devise necesita usar 20 tramos en prueba también. He cambiado la configuración, como a continuación:

# Limiting the stretches to just one in testing will increase the performance of 
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use 
# a value less than 10 in other environments. 
- config.stretches = Rails.env.test? ? 1 : 20 
+ config.stretches = 20 
10

La razón por la que no funciona es idear crea nombres de campos de formulario como

'user[email]' 
'user[password]' 

y post_via_redirect espera que esos nombres como argumentos. Así que la siguiente declaración haría un inicio de sesión exitoso.

post_via_redirect 'users/sign_in', 'user[email]' => '[email protected]', 'user[password]' => 'qwerty' 
+0

Solo en caso de que ayude, en mi caso porque era una prueba de integración de JSON solo 'post_via_redirect 'users/sign_in', usuario: {email:" [email protected] ", contraseña:" qwerty "}, formato: json' funcionó. – kangkyu

Cuestiones relacionadas