2017-02-21 2 views
2

Ich habe so abgekocht und sonst niemand Ergebnisse der scheint für mich zu arbeiten:Devise Rspec nicht definierte Methode `env‘ für nil: NilClass

Ich habe ein ControllerHelper Methode für meine Spec basiert vor, was für Devise vorgeschlagen wurde:

def login_existing_user 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    user = FactoryGirl.create(:user) 
    company = FactoryGirl.create(:company) 
    user.company_id = company.id 
    sign_in user 
end 

ich bin auch ein Company in diesem Verfahren zu schaffen, da das ist Schritt 2 des Anmeldevorganges für einen Benutzer in der Lage sein, meine authentifizierten Homepage.

An diesem Punkt versuche ich gerade mit meinem den Benutzer anmelden ScansControllerSpec:

RSpec.describe ScansController, type: :controller do 

    before(:all) do 
    login_existing_user 
    @device = build(:device) 
    end 

    describe "GET #create" do 
    it "returns http success" do 
     get :create, :device_id => @device.id 
     puts response 
     # expect(response).to have_http_status(:success) 
    end 
    end 

    .... 
end 

Aber ich diese Methode RSpecs für jede meiner CRUD bekommen:

1) ScansController GET #create returns http success 
    Failure/Error: @request.env["devise.mapping"] = Devise.mappings[:user] 

    NoMethodError: 
     undefined method `env' for nil:NilClass 
    # ./spec/support/controller_helpers.rb:15:in `login_existing_user' 
    # ./spec/controllers/scans_controller_spec.rb:6:in `block (2 levels) in <top (required)>' 

Wie andere Beiträge vorgeschlagen haben, schließe ich die Devise::TestHelpers in meine rails_helper.rb Datei ein. Ich habe auch meine eingeschlossen ControllerHelpers:

RSpec.configure do |config| 
    config.include Devise::TestHelpers, type: :controller 
    config.include Warden::Test::Helpers 
    Warden.test_mode! 

    config.infer_spec_type_from_file_location! 

    config.include ControllerHelpers, type: :controller 

    config.after do 
    Warden.test_reset! 
    end 
end 

Am Ende, ich brauche einen Benutzer bei Test anmelden zu können, die Controller-Methoden arbeiten geschützt. Ich bin nicht sicher, ob dies ein Assoziationsproblem ist, also werde ich hinzufügen, dass ein Benutzer eine company haben muss, und eine Firma muss eine subscription haben, um sich erfolgreich einzuloggen.

... aber ich kann nicht einmal so weit kommen, da dieser Fehler mich zurückhält.

+0

Controller Tests laufen nicht durch eine tatsächliche Anfrage, wenn Sie Zugriff auf das 'request' Objekt wollen (kein' @ '), dann definiert man machen diese Anforderungsspezifikationen. – Anthony

+0

@Anthony Entschuldigung, ich bin noch nicht so gut beim Testen. Also, wie gehe ich vor, um alle meine geschützten Controller-Methoden zu testen? Ich habe Devise 'before_action: authenticate_user!' In meinem 'application_controller.rb', was zu der Annahme führte, dass ich einen angemeldeten Benutzer nachahmen musste. – Godzilla74

+0

Wenn ich 'login_existing_user' aus meinen Tests heraushole, werde ich auf meine Anmeldeseite weitergeleitet. – Godzilla74

Antwort

Verwandte Themen