Aumento de todas las pruebas de Ruby: método indefinido 'autenticar' para nil: NilClass

132

La mayoría de mis pruebas están planteando lo siguiente y no entiendo por qué. Todos los métodos de llamada generan el error 'autenticar'. Verifiqué el código si había un método llamado "autenticar" pero no existe tal 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 desee ejecutar las pruebas usted mismo.

Jeffrey W.
fuente

Respuestas:

74

Soy consciente de que está utilizando Rspec pero con este mismo problema puede encontrarse Test::Unit. Solo necesita agregar los ayudantes de prueba de diseño atest/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end
Tim Fletcher
fuente
8

La respuesta anterior no me funcionó (RSpec 3.1)

Consulte https://stackoverflow.com/a/21166482/1161743 para obtener una solución que funcionó para mí.

Deberá cerrar sesión en un usuario anónimo antes de configurar variables:

before :each do
  sign_out :user
end
Jonathan Lin
fuente
1
Además, verifique que no haya incluido Devise :: TestHelpers varias veces, ya que esto puede causar problemas.
Joseph Siefers
8

en RSpec

como Jeffrey W. mencionó, en su respuesta anterior -> para configurar 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 necesita incluir ayudantes de diseño en todas las especificaciones de sus controladores, solo puede incluir explícitamente esos ayudantes en ese bloque de descripción de controlador:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end
equivalente8
fuente
2

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 ejecuté todas las especificaciones juntas, ocurrió el problema. Cuando ejecuté las especificaciones individualmente, 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 especificaciones que falla. Esto no resolvió el problema:

before :each do
  sign_out :user
end

Tampoco lo hizo:

after :each do
  sign_out :user
end

Inspirándome en la respuesta a esta pregunta de stackoverflow, ejecuté diferentes combinaciones de directorios rspec juntos para descubrir cuáles podrían estar interfiriendo entre sí. Al final descubrí que estaba llamando:

before() do #note no :each passed to before
  :
end

cuando cambié todas las ocurrencias 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.

Cathal Curtis
fuente
0

Si está trabajando con especificaciones de vista, puede tropezar current_user. Esto anula efectivamente el current_userayudante llamado desde su vista con lo que sea devuelto. 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
Pete
fuente
-3

Parece que hay algunas actualizaciones al código fuente. ApplicationController especifica que se debe authenticate_user!ejecutar un 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, la authenticate_user!función es parte de Rails 3 (usando el nuevodevise característica, de la que sé poco). Si la aplicación no puede encontrar el modelo de Usuario (ya sea por problemas de espacio de nombres o por cualquier motivo), el método fallará. La aplicación "enki" a la que se vinculó ahora es una aplicación Rails 3. Podría estar experimentando algunos dolores de crecimiento a medida que se convierte.

Berin Loritsch
fuente
2
Esta respuesta es aproximadamente 99% de tonterías puras.
max
-20

Ruby te está diciendo que ese método #authenticateaún no se ha definido nil. Puedes hacerlo fácilmente al:

def nil.authenticate!
  puts "Bingo! Nil is now authentic!"
end

Y el error desaparecerá.

Boris Stitnicky
fuente
1
por favor no hagas esto nil es nil, no es un objeto válido en el 90% de los casos.
Tiago Peczenyj