tutorial tests test spec run rails how espaƱol ruby-on-rails integration-testing devise machinist

ruby-on-rails - tests - run spec rails



Prueba de integraciĆ³n de rieles con la gema del ingenio (4)

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 el capítulo Cucumber también funcionará si tiene instalado Webrat / Capybara:

@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")

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.

Aquí hay un ejemplo simple:

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í está la salida de 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í está mi blueprints.rb:

require ''machinist/active_record'' require ''sham'' User.blueprint do email {"[email protected]"} password {"qwerty"} end


En primer lugar, con el diseño, es posible que tenga que "confirmar" al usuario.

puedes hacer algo como esto:

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

Aquí hay un ejemplo sin maquinista (pero solo tiene que reemplazar la parte del código de creación del usuario con la parte anterior):

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 tu 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


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

Estaba en una situación similar (migrando desde Authlogic) y tenía exactamente el 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 intentando 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. Cambié 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


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

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

y post_via_redirect espera 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''