Rails 3.1: тестирование «DELETE ‘destroy'» в спецификациях контроллера и маршрута

#ruby-on-rails-3 #rspec

#ruby-on-rails-3 #rspec

Вопрос:

Я тестирую приложение, которое использует Sorcery для аутентификации. У меня есть контроллер сеансов, который обрабатывает вход / выход пользователя с помощью тестов, чтобы соответствовать действиям. Я понимаю, что действие уничтожения обычно принимает идентификатор в качестве параметра, но в нем нет необходимости с функцией выхода.

routes.rb

 resources :sessions

# match "/signout", :to => "sessions#destroy"
  

sessions_controller_spec.rb

 describe "DELETE 'destroy'" do
  it "should log the user out" do
    login_user(Factory(:user))
    delete :destroy
    controller.current_user.should be_nil
    controller.should_not be_signed_in
  end 
end
  

session_routes_spec.rb

 it "should route DELETE /sessions to sessions#destroy" do
  { :delete => "/sessions" }.should route_to(
    :controller => "sessions",
    :action => "destroy"
  )
end
  

Оба вышеуказанных теста завершаются неудачей, поскольку маршрут ожидает идентификатор. Есть ли способ избавиться от этой необходимости? Я знаю, что мог бы просто использовать именованный маршрут «signout_path», но мне просто любопытно, могу ли я все еще использовать session_path, :method =>:delete, не передавая ему идентификатор.

Что меня действительно шокирует, так это то, что если я раскомментирую совпадение «/ signout», спецификация контроллера проходит (однако спецификация маршрута этого не делает). Как строка соответствия приводит к передаче спецификации контроллера?

Ответ №1:

Попробуйте сопоставить действие уничтожения как: метод сбора ресурсов сеансов в вашем config / routes.rb:

 resources :sessions, :collection => [:destroy]
  

По умолчанию destroy — это метод-член, для работы с которым требуется указанный ресурс.