ruby-on-rails - instalar - rspec rails devise
Todas las pruebas de Ruby plantean: método indefinido `authenticate ''for nil: NilClass (8)
La mayoría de mis pruebas están planteando lo siguiente y no entiendo por qué. Todos los métodos invocan el error ''autenticar''. Revisé el código si había un método llamado "autenticar" pero no existe dicho método.
1) Admin::CommentsController handling GET to index is successful
Failure/Error: get :index
undefined method `authenticate!'' for nil:NilClass
# ./spec/controllers/admin/comments_controller_spec.rb:9:in `block (3 levels) in <top (required)>''
124) PostsController handling GET for a single post should render show template
Failure/Error: get :show, :year => ''2008'', :month => ''01'', :day => ''01'', :slug => ''a-post''
undefined method `authenticate'' for nil:NilClass
# ./app/controllers/application_controller.rb:18:in `set_current_user_for_model''
# ./spec/controllers/posts_controller_spec.rb:131:in `do_get''
# ./spec/controllers/posts_controller_spec.rb:140:in `block (3 levels) in <top (required)>''
El proyecto se puede encontrar allí => https://github.com/agilepandas/enki en caso de que quiera ejecutar las pruebas usted mismo.
Esta pregunta ha sido respondida en Twitter por @MatthewClosson
@jeffehh Necesita crear un archivo spec / support / devise.rb como se especifica aquí https://github.com/plataformatec/devise#test-helpers para incluir los ayudantes de prueba de diseño #ruby
Gracias una vez más.
Estaba experimentando los mismos fracasos en uno de mis proyectos. Está utilizando Ruby 2.0.0-p598, Rails 3.2.21, RSpec 2.99. Cuando ejecuto todas las especificaciones juntas, ocurrió el problema. Cuando ejecuté las especificaciones de forma individual, pasaron. Tengo lo siguiente incluido en mi spec / spec_helper.rb:
RSpec.configure do |config|
# ...
config.include Devise::TestHelpers, type: :controller
# ...
end
Agregué lo siguiente a la primera descripción en cada archivo de especificación que falla. Esto no resolvió el problema:
before :each do
sign_out :user
end
Tampoco lo hizo:
after :each do
sign_out :user
end
Tomando la inspiración de la respuesta a this pregunta de , ejecuté diferentes combinaciones de directorios de rspec para descubrir cuáles interferían entre sí. Al final descubrí que estaba llamando:
before() do #note no :each passed to before
:
end
cuando cambié todas las apariciones de esto a:
before(:each) do
:
end
Todas las especificaciones pasaron sin la falla:
undefined method `authenticate'' for nil:NilClass
Espero que esto sea de ayuda para otros.
La respuesta anterior no funcionó para mí (RSpec 3.1)
Consulte https://.com/a/21166482/1161743 para obtener una solución que funcionó para mí.
Deberá cerrar la sesión de un usuario anónimo antes de configurar las variables:
before :each do
sign_out :user
end
Parece que hay algunas actualizaciones del código fuente. ¡ApplicationController especifica que debe haber un usuario authenticate_user!
ejecutar filtro antes de cualquier solicitud. Este hilo proporciona algunos antecedentes sobre problemas con él:
http://groups.google.com/group/plataformatec-devise/browse_thread/thread/f7260ebe2d9f7316?fwc=1
Esencialmente, authenticate_user!
la función es parte de Rails 3 (usando la nueva característica de devise
, de la cual sé poco). Si la aplicación no puede encontrar el modelo de Usuario (ya sea por problemas de espacio de nombres o por cualquier razón), el método fallará. La aplicación "enki" a la que se vinculó ahora es una aplicación de Rails 3. Podría experimentar algunos dolores de crecimiento a medida que se convierta.
Ruby te está diciendo que el método #authenticate
no se ha definido aún en nil
. Puedes hacerlo fácilmente por:
def nil.authenticate!
puts "Bingo! Nil is now authentic!"
end
Y el error desaparecerá.
Si está trabajando con especificaciones de vista, puede resguardarse de current_user
. Esto anula de manera efectiva al ayudante current_user
usuario llamado desde su vista con lo que se devuelve. Así es como con rspec-3.2.3:
RSpec.describe "projects/show", type: :view do
before(:each) do
allow(view).to receive(:current_user).and_return(FactoryGirl.create(:user))
end
it "renders attributes in <p>" do
render
expect(rendered).to match(/whatever you want to regex match here/)
end
end
Soy consciente de que está utilizando Rspec, pero puede encontrarse con este mismo problema con Test::Unit
. Solo necesita agregar los ayudantes de test/test_helper.rb
para test/test_helper.rb
class ActiveSupport::TestCase
include Devise::TestHelpers
end
en RSpec
como Jeffrey W. mencionó, en su respuesta anterior -> para establecer esto a todos los controladores:
RSpec.configure do |config|
# ...
config.include Devise::TestHelpers, type: :controller
# ...
end
sin embargo, si esto es relevante para una sola especificación, no necesariamente es necesario incluir ayudantes para todas las especificaciones de sus controladores, solo puede incluir explícitamente a los ayudantes en ese bloque de descripción de un controlador:
require ''spec_helper''
describe MyCoolController
include Devise::TestHelpers
it { }
end