2010-11-29 11 views
128

Die meisten meiner Tests erhöhen das Folgende und ich verstehe nicht warum. Alle Methoden rufen den 'authenticate' Fehler auf. Ich habe den Code überprüft, ob es eine Methode namens "authenticate" gab, aber es gibt keine solche Methode.Alle Ruby-Tests erhöhen: undefinierte Methode `authenticate 'für 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)>' 

Das Projekt kann dort =>https://github.com/agilepandas/enki im Fall gefunden werden, Sie möchten, dass die Tests, um sich selbst laufen.

Antwort

189

Diese Frage auf Twitter von @MatthewClosson beanwortet

@jeffehh Sie benötigen einen spec/support/devise.rb Datei als hier angegeben erstellen https://github.com/plataformatec/devise#test-helpers zu schließen die devise Test Helfer #ruby

Danke noch einmal.

+0

Vergessen Sie nicht, diese Antwort als akzeptiert zu markieren, wenn sie behoben wurde. –

+2

Tatsächliche URL protokollieren (anstelle von bit.ly): Auf der Devise-Seite (https://github.com/plataformatec/devise), siehe Abschnitt "Test-Hilfsprogramme". – Zabba

-3

Es sieht so aus, als gäbe es einige Aktualisierungen des Quellcodes. Der ApplicationController gibt an, dass vor jeder Anforderung ein Filter authenticate_user! ausgeführt werden muss. Dieser Thread bietet einige Hintergrundinformationen über Probleme mit ihm:

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

Wesentliches der authenticate_user! Funktionsteil von Rails 3 (die neuen devise-Funktion, von denen ich weiß wenig über). Wenn die App das Benutzermodell nicht finden kann (entweder aufgrund von Namensraumproblemen oder aus anderen Gründen), schlägt die Methode fehl. Die Anwendung "enki", mit der Sie verbunden sind, ist jetzt eine Rails 3-Anwendung. Es könnte einige Wachstumsschmerzen erfahren, wenn es umwandelt.

+2

Diese Antwort ist über 99% purer Unsinn. – max

71

Ich bin mir bewusst, dass Sie Rspec verwenden, aber Sie können in dasselbe Problem mit laufen. Sie müssen nur die devise Test Helfer test/test_helper.rb

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

Das hat den Trick für mich gemacht! – Jenny

+1

das ist die richtige Antwort, wenn Sie Test :: Unit – 2mia

+0

Arbeite für mich verwenden !!! –

-19

Ruby hinzufügen sagt Ihnen, diese Methode #authenticate auf nil hat definded bisher noch nicht. Sie können es leicht tun durch:

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

Und der Fehler wird weggehen.

+28

Boris, du bist mein neuer Held – i2w

+14

'def nil.method_missing; setzt "fixed all nil errors!"; Ende' – Zubin

+3

Boris, würdest du mich heiraten? Bitte. – okeen

7

Die obige Antwort für mich nicht funktioniert hat (RSpec 3.1)

Siehe https://stackoverflow.com/a/21166482/1161743 für eine Lösung, die für mich gearbeitet.

Sie müssen ein anonymer Benutzer abzumelden, bevor Variablen einrichten:

before :each do 
    sign_out :user 
end 
+1

Überprüfen Sie auch, dass Sie Devise :: TestHelpers nicht mehrfach enthalten haben, da dies Probleme verursachen kann. –

7

in RSpec

als Jeffrey W.erwähnt, in seiner answer above -> diese an alle Regler einstellen:

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

jedoch, wenn dies nur ein spec relevant ist, müssen Sie nicht unbedingt Helfer Spezifikationen auf alle Ihre Controller enthalten ersinnen, können Sie nur explizit jene Helfer in diesem einen Controller beschreiben Block umfassen:

require 'spec_helper' 
describe MyCoolController 
    include Devise::TestHelpers 

    it { } 
end 
0

Wenn Sie mit Blick spec arbeiten, können Sie von current_user Stummel. Dies überschreibt wirksam den current_user Helfer, der aus Ihrer Sicht mit allem aufgerufen wurde, was zurückgegeben wird. Hier ist, wie mit 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

ich die gleichen Fehler in einem meiner Projekte zu erfahren. Es verwendet Ruby 2.0.0-P598, Rails 3.2.21, RSpec 2.99. Wenn ich alle Spezifikationen zusammen ausführen, trat das Problem auf. Als ich die Spezifikationen einzeln ausführte, bestanden sie. Ich habe das in meinem spec/spec_helper.rb enthalten folgende:

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

Ich habe folgendes auf den ersten in jedem Fehler Spec-Datei beschreiben. Das hat beheben das Problem nicht:

before :each do 
    sign_out :user 
end 

Weder tat

after :each do 
    sign_out :user 
end 

Inspiriert von der Antwort auf this Stackoverflow Frage, lief ich verschiedene Kombinationen von rspec Verzeichnisse zusammen, um herauszufinden, welche davon stören könnte miteinander. Ich Am Ende entdeckte ich rief:

before(:each) do 
    : 
end 

All das, ohne den Fehler bestanden Spezifikationen:

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

, wenn ich alle Vorkommen dieses geändert

undefined method `authenticate' for nil:NilClass 

Ich hoffe, das hilft anderen.

Verwandte Themen