tutorial rails instalar ejemplos auth ruby-on-rails ruby testing rspec devise

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