Estoy intentando escribir una prueba de solicitud que afirme que aparecen los enlaces adecuados en el diseño de la aplicación dependiendo de si el usuario está conectado o desconectado . FWIW, estoy usando Devise para la pieza de autenticación."No se pudo encontrar una asignación válida para # <User ...>" solo en las segundas y sucesivas pruebas
Aquí es mi especificación:
require 'spec_helper'
require 'devise/test_helpers'
describe "Layout Links" do
context "the home page" do
context "session controls" do
context "for an authenticated user" do
before do
# I know these should all operate in isolation, but I
# want to make sure the user is explicitly logged out
visit destroy_user_session_path
@user = Factory(:user, :password => "Asd123", :password_confirmation => "Asd123")
@user.confirm!
# I tried adding this per the Devise wiki, but no change
@request.env["devise.mapping"] = Devise.mappings[:user]
# Now log a new user in
visit new_user_session_path
fill_in "Email", :with => @user.email
fill_in "Password", :with => "Asd123"
click_button "Sign in"
get '/'
end
it "should not have a link to the sign in page" do
response.should_not have_selector(
'#session a',
:href => new_user_session_path
)
end
it "should not have a link to registration page" do
response.should_not have_selector(
'#session a',
:href => new_user_registration_path
)
end
it "should have a link to the edit profile page" do
response.should have_selector(
'#session a',
:content => "My Profile",
:href => edit_user_registration_path
)
end
it "should have a link to sign out page" do
response.should have_selector(
'#session a',
:content => "Logout",
:href => destroy_user_session_path
)
end
end # context "for an authenticated user"
end # context "session controls"
end
end
pasa la primera prueba, pero los tres últimos todos fallan con el error
Failure/Error: @user = Factory(:user, :password => "Asd123", :password_confirmation => "Asd123")
RuntimeError:
Could not find a valid mapping for #<User id: xxx, ...>
He buscado a través de la wiki Diseñar, grupo de Google y los resultados de búsqueda por una causa, pero todo lo que encuentro son preguntas o sugerencias sin respuesta para establecer config.include Devise::TestHelpers, :type => :controller
, pero eso solo se aplica a las pruebas del controlador, no solicita prueba.
actualización
que he hecho un poco más de la solución de problemas y no puedo hacer cara o cruz de lo que está en última instancia, provocando el problema. Eche un vistazo al siguiente código.
En primer lugar, para algunos contexto, aquí está la declaración de fábrica del usuario. Funciona bien en pruebas unitarias.
# spec/factories.rb
Factory.define :user do |f|
f.email { Faker::Internet.email }
f.email_confirmation { |f| f.email }
f.password "AbcD3fG"
f.password_confirmation "AbcD3fG"
f.remember_me { (Random.new.rand(0..1) == 1) ? true : false }
end
Ahora, consideremos la siguiente prueba de integración
# spec/requests/user_links_spec.rb
require "spec_helper"
describe "User Links" do
before(:each) do
# This doesn't trigger the problem
# @user = nil
# This doesn't trigger the problem
# @user = User.new
# This doesn't trigger the problem
# @user = User.create(
# :email => "[email protected]",
# :email_confirmation => "[email protected]",
# :password => "asdf1234",
# :password_confirmation => "asdf1234"
#)
# This doesn't trigger the problem
# @user = User.new
# @user.email = Faker::Internet.email
# @user.email_confirmation = @user.email
# @user.password = "AbcD3fG"
# @user.password_confirmation = "AbcD3fG"
# @user.remember_me = (Random.new.rand(0..1) == 1) ? true : false
# @user.save!
# This triggers the problem!
@user = Factory(:user)
# This doesn't trigger the same problem, but it raises a ActiveRecord::AssociationTypeMismatch error instead. Still no idea why. It was working fine before in other request tests.
# @user = Factory(:brand)
end
context "when using `@user = Factory(:user)` in the setup: " do
2.times do |i|
it "this should pass on the 1st iteration, but not the 2nd (iteration ##{i+1})" do
# This doesn't trigger an error
true.should_not eql(false)
end
it "this should pass on the 1st iteration, but trigger the error that causes all successive test cases to fail (iteration ##{i+1})" do
# Every test case after this will be borken!
get '/'
end
it "this will fail on all iterations (iteration ##{i+1})" do
# This will now trigger an error
true.should_not eql(false)
end
end
end
end
Si comentar o reemplazamos el bit get '/'
con cualquier otra cosa (o nada en absoluto), las pruebas de todos corren finas.
Entonces, no sé si esto es un problema factory_girl (tiendo a dudarlo ya que puedo usar fábricas de usuarios en otro lugar sin problema) o un problema de Devise (comencé a recibir estos errores después de configurar esa gema en mi aplicación, pero también solo tuve otra prueba de solicitud que funcionó bien, pero ahora está obteniendo ese error AssociationTypeMismatch, correlación ≠ causalidad ...) o un problema RSpec o algún otro conflicto joya de borde extraño.
me encontré con que esto ocurre incluso si los usuarios no son en realidad utilizado en cualquiera de los casos de prueba. Estoy publicando una actualización del ticket porque es demasiado grande para publicarlo en el formulario de comentarios. –
Encontré un hilo en el grupo de correo Devise discutiendo sobre este mismo problema, pero hasta ahora no hay respuestas. http://groups.google.com/group/plataformatec-devise/browse_thread/thread/4ada5b12c0c279cd/053ee22cdcf658d1 –