2010-11-29 9 views
128

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.Todas las pruebas de Ruby plantean: método indefinido `authenticate 'for nil: NilClass

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 por allí =>https://github.com/agilepandas/enki en caso de que desea ejecutar las pruebas de su auto.

Respuesta

189

Esta pregunta ha sido contestada en Twitter por @MatthewClosson

@jeffehh Es necesario crear un soporte de archivos devise.rb spec// como se especifica aquí https://github.com/plataformatec/devise#test-helpers a incluyen los ayudantes de prueba legado #ruby

Gracias una vez más.

+0

No olvide marcar esta respuesta como aceptada si se solucionó. –

+2

Registrando URL real (en lugar de bit.ly): en la página de diseño (https://github.com/plataformatec/devise), consulte la sección "Ayudantes de prueba". – Zabba

-3

Parece que hay algunas actualizaciones del código fuente. ApplicationController especifica que debe haber una ejecución de filtro authenticate_user! antes de cualquier solicitud. El hilo da algunos antecedentes de problemas con él:

http://groups.google.com/group/plataformatec-devise/browse_thread/thread/f7260ebe2d9f7316?fwc=1

En esencia, la función authenticate_user! es parte de Rails 3 (usando la nueva característica devise, de los cuales sé poco acerca). 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.

+2

Esta respuesta es aproximadamente un 99% puro sinsentido. – max

71

Soy consciente de que está utilizando Rspec pero puede encontrarse con este mismo problema con Test::Unit. Sólo tiene que añadir los ayudantes de prueba legado a test/test_helper.rb

class ActiveSupport::TestCase 
    include Devise::TestHelpers 
end 
+0

¡Esto me sirvió! – Jenny

+1

esta es la respuesta correcta si usa Test :: Unit – 2mia

+0

¡Funcionó para mí! –

-19

Rubí le está diciendo, ese método no ha sido #authenticate definded en nil todavía. Puede hacerlo fácilmente por:

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

Y el error desaparecerá.

+28

Boris, usted es mi nuevo héroe – i2w

+14

'def nil.method_missing; pone "corregido todos los errores nulos!"; fin' – Zubin

+3

Boris, ¿te casarías conmigo? Por favor. – okeen

7

La respuesta anterior no funcionó para mí (RSpec 3.1)

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

Usted tendrá que cerrar la sesión un usuario anónimo antes de configurar variables:

before :each do 
    sign_out :user 
end 
+1

Además, compruebe que no ha incluido Devise :: TestHelpers varias veces, ya que esto puede causar problemas. –

7

en RSpec

como Jeffrey W.se mencionó, en su answer above -> establecer esto en todos los controladores:

RSpec.configure do |config| 
    # ... 
    config.include Devise::TestHelpers, type: :controller 
    # ... 
end 

sin embargo, si esto es relevante a una sola especificación, que no necesariamente tiene que incluir idear ayudantes a todos los controladores de especificaciones, se puede basta con incluir explícitamente los ayudantes en que un controlador de describir bloque:

require 'spec_helper' 
describe MyCoolController 
    include Devise::TestHelpers 

    it { } 
end 
0

Si está trabajando con las especificaciones vista, puede colilla de current_user. Esto efectivamente anula la ayuda current_user llamada 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 
1

Experimentaba los mismos errores en uno de mis proyectos. Está usando 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 el siguiente incluido en mi especificación/spec_helper.rb:

RSpec.configure do |config| 
    # ... 
    config.include Devise::TestHelpers, type: :controller 
    # ... 
end 

que añade lo siguiente a la primera describir en cada archivo de especificaciones no. Esto no resolvió el problema:

before :each do 
    sign_out :user 
end 

tampoco lo hizo:

after :each do 
    sign_out :user 
end 

Inspirándose en la respuesta a this cuestión stackoverflow, me encontré con diferentes combinaciones de directorios rspec juntos para averiguar cuáles podrían estar interfiriendo juntos. Al final descubrí que estaba llamando:

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

cuando cambié todas las ocurrencias de este a:

before(:each) do 
    : 
end 

Todas las especificaciones aprobadas sin el fracaso:

undefined method `authenticate' for nil:NilClass 

espero esto es de ayuda para otros.

Cuestiones relacionadas