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