Просмотр Rspec для анонимного контроллера

Я пытаюсь проверить метод на контроллере приложения, который будет использоваться как фильтр перед. Для этого я установил анонимный контроллер в своем тесте с применением фильтра before, чтобы убедиться, что он функционирует правильно.

Тест теперь выглядит следующим образом:

describe ApplicationController do
  controller do
    before_filter :authenticated

    def index      
    end
  end

  describe "user authenticated" do
    let(:session_id){"session_id"}
    let(:user){OpenStruct.new(:email => "[email protected]", :name => "Colin Gemmell")}

    before do
      request.cookies[:session_id] = session_id
      UserSession.stub!(:find).with(session_id).and_return(user)
      get :index
    end

    it { should assign_to(:user){user} }

  end
end

И контроллер приложения выглядит так:

class ApplicationController < ActionController::Base
  protect_from_forgery

  def authenticated
    @user = nil
  end
end

Моя проблема в том, когда я запускаю тест, я получаю следующую ошибку

1) ApplicationController user authenticated 
   Failure/Error: get :index
   ActionView::MissingTemplate:
     Missing template stub_resources/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>[:html], :locale=>[:en, :en]} in view paths "#<RSpec::Rails::ViewRendering::PathSetDelegatorResolver:0x984f310>"

В соответствии с документами представление не является рендером при выполнении тестов контроллера, однако это указывает на отсутствие заглушки, существующей для этого действия (что понятно как представление не существует)

Кто-нибудь знает, как решить эту проблему или закрыть заглушку.

Приветствия Colin G

Ответы

Ответ 1

Не могли бы вы обойти это, поставив:

render :nothing => true

внутри действия #index?

Ответ 2

Если ничего не изменилось из этого сообщения в блоге, RSpec 2 нуждается в файле шаблона представления для работы спецификаций контроллера. Сам файл не отображается (если вы не добавили render_views), поэтому содержимое не имеет значения - на самом деле вы можете просто добавить пустой файл с touch index.html.erb.

Ответ 3

Лучший способ сделать это - создать каталог фиктивных представлений. Я бы не использовал spec/views, так как это действительно для действительных тестов просмотра. Вместо этого создайте эту структуру каталогов:

spec/test_views/anonymous
     index.html.erb
     ... and any other anonymous controller templates you happen to need ...

index.html.erb может быть пустым, как отмечено, поскольку rspec2 проверяет только существование, а не содержимое.

Затем в инициализаторе application.rb поместите эту строку:

# add a view directory for the anonymous controller tests
config.paths['app/views'] << "spec/test_views" if Rails.env.test?

Примечание. Я попытался поместить эту строку в test.rb, по какой-то причине, похоже, там не работает.