2016-07-17 26 views
31

Używam Rails 5 i Devise 3.5.1.Dlaczego mój RSpec nie ładuje się Devise :: Test :: ControllerHelpers?

Przeglądanie ładnej (starszej) książki o tworzeniu/testowaniu interfejsu API, który korzysta z uwierzytelniania Devise. Został napisany przed Railsami 5, więc zdecydowałem się nie używać nowej wersji tylko api.

Oto moja próba ...

#/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 

A oto zupełnie nieoczekiwany błąd RSpec

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. 

Więc idę tutaj - http://www.rubydoc.info/gems/devise/Devise/Test/ControllerHelpers

i próbowałem ->obejmują opracować: : Test :: ControllerHelpers

co nie pomogło, ponieważ plik controller_helpers.rb nigdzie nie był w moim projekcie

Czego tu brakuje?

Dzięki

Odpowiedz

71

Można dodać następujące do rails_helper:

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

będą to Devise::Test::ControllerHelpers moduł we wszystkich :controller specyfikacji.

+0

OK to ma sens. Dziekuje panu. Typ:: kontroler jest tylko po to, aby zaoszczędzić pamięć, gdy RSpec uruchamia inne typy testów? – dwilbank

+3

'Devise :: Test :: ControllerHelpers' jest przeznaczony do użytku tylko w testach kontrolerów, więc myślę, że niektóre z innych specyfikacji mogą być uszkodzone, jeśli są zawarte we wszystkich z nich. Dlatego musimy podać 'type:: controller'. – lest

9

W spec_helper.rb dodatku:

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

Jest to przydatne nawet dla osób, które nie używają rspec. +1 – Fuser97381

+0

dla tych, którzy czytają w przyszłości - jeśli używasz szyn - rozważ umieszczenie tego w swoim routingu. – BKSpurgeon