Rspec stubing view для анонимного контроллера - PullRequest
14 голосов
/ 01 марта 2011

Я пытаюсь протестировать метод на контроллере приложения, который будет использоваться в качестве фильтра до. Для этого в моем тесте я установил анонимный контроллер с примененным фильтром 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 => "pythonandchips@gmail.com", :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>"

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

У любого есть подсказка, как решить эту проблему или заглушка.

Приветствие Колин Г

Ответы [ 3 ]

19 голосов
/ 01 марта 2011

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

render :nothing => true

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

3 голосов
/ 01 марта 2011

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

2 голосов
/ 10 декабря 2012

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

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

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

Тогда в вашем приложенииинициализатор .rb, поместите эту строку:

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

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

...