2016-07-17 15 views
31

Ich verwende Rails 5 und Devise 3.5.1.Warum lädt meine RSpec nicht Devise :: Test :: ControllerHelpers?

Durch ein schönes (älteres) Buch über das Erstellen/Testen einer API, die Devise-Authentifizierung verwendet. Es wurde vor Rails 5 geschrieben, daher entschied ich mich, die neue api-only-Version nicht zu verwenden.

Hier ist mein Test ...

#/spec/controllers/api/v1/users_controller_spec.rb  

require 'rails_helper' 

describe Api::V1::UsersController, :type => :controller do 
    before(:each) { request.headers['Accept'] = "application/vnd.marketplace.v1" } 
    describe "GET #show" do 
     before(:each) do 
      @user = FactoryGirl.create :user 
      get :show, params: {id: @user.id}, format: :json 
     end 
     it "returns the information about a reporter on a hash" do 
      user_response = JSON.parse(response.body, symbolize_names: true) 
      expect(user_response[:email]).to eql @user.email 
     end 
     it { should respond_with 200 } 
    end 
end 

Und hier ist ein völlig unerwarteter RSpec Fehler

Devise::MissingWarden: 
     Devise could not find the `Warden::Proxy` instance on your request environment. 
     Make sure that your application is loading Devise and Warden as expected and that the `Warden::Manager` middleware is present in your middleware stack. 
     If you are seeing this on one of your tests, ensure that your tests are either executing the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` module to inject the `request.env['warden']` object for you. 

Also gehe ich hier - http://www.rubydoc.info/gems/devise/Devise/Test/ControllerHelpers

und versuchte, diese ->Devise umfassen: : Test :: ControllerHelper

was nicht geholfen hat, weil die Datei controller_helpers.rb nirgends in meinem Projekt ist

Was habe ich hier vermisst?

Dank

Antwort

71

Sie könnten Sie folgendes zu Ihrem rails_helper hinzufügen:

RSpec.configure do |config| 
    config.include Devise::Test::ControllerHelpers, type: :controller 
end 

Dieses Devise::Test::ControllerHelpers Modul in allen :controller Spezifikationen umfassen wird.

+0

OK, die Sinn macht. Danke, mein Herr. Der Typ:: Controller dient nur dazu, Speicher zu sparen, wenn RSpec andere Arten von Tests ausführt? – dwilbank

+3

'Devise :: Test :: ControllerHelpers' ist nur für die Verwendung in Controllertests gedacht, daher denke ich, dass einige andere Spezifikationen gebrochen sein könnten, wenn sie in allen enthalten sind. Deshalb müssen wir 'type:: controller' angeben. – lest

9

Im spec_helper.rb add:

config.include Devise::Test::ControllerHelpers, :type => :controller 
+0

Dies ist auch für Leute hilfreich, die rspec nicht verwenden. +1 – Fuser97381

+0

10 für diejenigen, die in Zukunft lesen - wenn Sie Schienen verwenden - ziehen Sie in Betracht, dies in Ihrem rails_helper zu setzen. – BKSpurgeon