2012-01-11 6 views
8

ApplicationController:Rails + rspec + devise = undefined method `authenticate_user! '

class ApplicationController < ActionController::Base 
    before_filter :authenticate_user! 

    protect_from_forgery 
end 

DashboardsController:

class DashboardsController < ApplicationController 
    def index 
    end 

end 

DashboardsControllerSpec:

require 'spec_helper' 
describe DashboardsController do 
    include Devise::TestHelpers 

    describe "GET 'index'" do 
    it "returns http success" do 
     get 'index' 
     response.should be_success 
    end 
    end 
end 

Результат:

Failure/Error: get 'index' 
    NoMethodError: 
     undefined method `authenticate_user!' for #<DashboardsController:0x007fef81f2efb8> 

Рельсы версия: 3.1.3

Rspec версия: версия 2.8.0

Разрабатывают: 1.5.3

Примечание: Я также создал поддержки/файл deviser.rb, но это не помогает. Есть идеи?

+1

[devize Wiki] (https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3- (and-rspec)) предоставляет несколько различных способов интеграции разработки с rspec. –

ответ

12
require 'spec_helper' 
describe DashboardsController do 
    before { controller.stub(:authenticate_user!).and_return true } 
    describe "GET 'index'" do 
    it "returns http success" do 
     get 'index' 
     response.should be_success 
    end 
    end 
end 

Update:

Использование выше синтаксиса с последней RSpec даст ниже предупреждения

Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from `block (2 levels) in <top (required)>'. 

Используйте этот новый синтаксис

before do 
    allow(controller).to receive(:authenticate_user!).and_return(true) 
    end 
+0

Я нашел 'controller.stub (: authenticate_user!). And_return true' строка очень полезная. Однако строка 'include Devise :: TestHelpers' не нужна и вводит в заблуждение. Здесь не используются никакие методы из 'Devise :: TestHelpers', и одна из причин, по которым нужно заглушить' authenticate_user! ', Заключается в том, чтобы избежать связи с машиной Devise. – evanrmurphy

+1

@evanrmurphy yeap, вы непременно правы, не знаю, что это включает в мой ответ, я удалю его :) –

7

Является ли ваша модель имя что-то другое, чем Пользователь? Если это, например, Admin, то вам необходимо сменить фильтр:

before_filter :authenticate_admin! 

Это немного меня немного; Я начал с User в качестве моей модели, а позже решил добавить Devise к модели с именем Member вместо этого, но я оставил исходный :authenticate_user! в своем контроллере и продолжал получать эту ошибку при запуске RSpec.

+0

спасибо спасибо спасибо! –

3

Похоже, лучший способ сделать это в вашем файле spec_helper.rb:

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

Смотрите rspec wiki для более подробной информации.

1

В моем случае я забыл, что прокомментировал строку devise_for в файле routes.rb.

Смежные вопросы