Rails + rspec + devise = неопределенный метод `authenticate_user! ' - PullRequest
8 голосов
/ 11 января 2012

ApplicationController:

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>

Версия Rails: 3.1.3

Версия Rspec: 2.8.0

Разработать версию: 1.5.3

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

Ответы [ 4 ]

12 голосов
/ 11 января 2012
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

Обновление:

Использование приведенного выше синтаксиса с последним 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
7 голосов
/ 09 марта 2012

Название вашей модели отличается от имени пользователя?Если это, например, Admin, то вам нужно изменить фильтр на:

before_filter :authenticate_admin!

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

3 голосов
/ 05 июля 2013

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

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

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

1 голос
/ 20 сентября 2013

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

...