Фильтр входа в RSpec Rails

Недавно я начал использовать rspec-rails(2.6.1) с моим приложением Rails(3.0.8). Я привык к Test::Unit и не могу заставить фильтр работать для моих тестовых методов. Мне нравится, чтобы все было как можно СУХИМ, поэтому я хотел бы настроить фильтр, который я могу вызывать для любого тестового метода, который войдет в систему как пользователь Authlogic до вызова тестового метода. Я попытался сделать это с помощью фильтра RSpec. в spec_helper.rb:

config.before(:each, :login_as_admin => true) do 
  post "/user_sessions/create", :user_session => {:username => "admin", :password => "admin"}   
end

Затем я использую его в соответствующем тестовом методе (в данном случае spec/controllers/admin_controller_spec.rb):

require 'spec_helper'

describe AdminController do  
  describe "GET index" do        
    it("gives a 200 response when visited as an admin", :login_as_admin => true) do   
      get :index
      response.code.should eq("200")
    end    
  end
end

Однако я получаю эту ошибку, когда запускаю rspec spec:

Failures:

  1) AdminController GET index gives a 200 response when visited as an admin
     Failure/Error: Unable to find matching line from backtrace
     RuntimeError:
       @routes is nil: make sure you set it in your test's setup method.

Блех. Могу ли я отправить только один HTTP-запрос на тест? Я также попытался заглушить мой метод authentication_admin (внутри блока config.before), но безуспешно.


person dhulihan    schedule 18.06.2011    source источник


Ответы (2)


К сожалению, на данный момент нет способа сделать то, что вы пытаетесь сделать, в глобально определенном хуке before. Причина в том, что хуки before выполняются в том порядке, в котором они зарегистрированы, а хуки, объявленные в RSpec.configure, регистрируются перед хуками, которые rspec-rails регистрируются внутри для настройки контроллера, запроса, ответа и т. д.

Кроме того, об этом сообщается на https://github.com/rspec/rspec-rails/issues/391.

person David Chelimsky    schedule 18.06.2011
comment
Спасибо за информацию, Давид. Я рад видеть, что об этом уже сообщили. Кроме того, спасибо за вашу работу над RSpec, это действительно удобный фреймворк для тестирования. - person dhulihan; 18.06.2011

Вы должны использовать макроны Шульды. Для использования следует изменить ваш spec_helper.rb

RSpec.configure do |config|
  config.include Clearance::Shoulda::Helpers
end

А затем можно настроить фильтр в спецификации контроллера, например

require 'spec_helper'

describe AdminController do  
  fixture :users

  before(:each) do
    sign_in_as users(:your_user)
  end
  describe "GET index" do        
    it("gives a 200 response when visited as an admin", :login_as_admin => true) do   
      get :index
      response.code.should eq("200")
    end    
  end
end
person MKumar    schedule 18.06.2011
comment
Это не решит проблему, которую пытается решить OP, поскольку биты, которые sign_in_as должны работать (контроллер и т. д.), не будут установлены до before ловушки, определенной в RSpec.configure. - person David Chelimsky; 18.06.2011