rails3 и rspec2: ошибка несоответствия маршрута (пока он работает в приложении)

#ruby-on-rails #ruby-on-rails-3 #rspec2

#ruby-on-rails #ruby-on-rails-3 #rspec2

Вопрос:

В моем routes.rb у меня есть следующее:

 get 'home/index'
root :to => 'home#index'
  

Если я запущу rake routes | grep home , вы увидите

 home_index GET    /home/index(.:format)      {:action=>"index", :controller=>"home"}
root              /(.:format)                {:action=>"index", :controller=>"home"}
  

Итак, у application.html.haml меня есть ссылка на root_path , которая прекрасно преобразуется в

 {:controller => "home", :action => :index}
  

Но при каждом запуске спецификации я получаю ошибку:

 No route matches {:controller=>"home"}
  

Хотя, если я запускаю приложение в процессе разработки, все отображается
без каких-либо проблем и корректно кликабелен.

У кого-нибудь есть какие-либо подсказки относительно того, что я сделал не так?

Я должен добавить, что приложение rails находится в процессе переноса с rails 2.3.11 на rails 3. Должно быть, я что-то упустил, но я не вижу, что.

[РЕДАКТИРОВАТЬ: дополнительные выводы]

Я опробовал еще кое-что. Тест отлично выполняется в Rubymine, или если я использую командную строку и набираю

 rspec spec/controllers/users_controller/*.spec.rb
  

Но они не работают, если я использую

 rake spec
  

В чем разница? Я удалил lib/tasks/rspec.rake файл (который был сгенерирован для rspec1) и вижу, что выполнена правильная команда:

 bundle exec rspec 
  

Итак, я немного в недоумении.

[РЕДАКТИРОВАТЬ: дополнительное тестирование]

При запуске

 rspec spec/controller/**/*_spec.rb
  

мои тесты завершаются неудачей при запуске

 rspec spec/controller/accounts_controller/*_spec.rb
  

В верхней части моих файлов у меня есть следующее:

 describe AccountsController do
  

Я добавил тип явно:

 describe AccountsController, :type => :controller do
  

Но это не имело никакого эффекта.

У кого-нибудь есть какие-нибудь советы?

Ответ №1:

попробуйте добавить эту строку в свои маршруты

 resources :home, :controller => :home
  

Комментарии:

1. Привет @fl00r, спасибо за ваш совет. Для меня это ничего не меняет. На самом деле у меня есть get 'home/index' внутри маршрутов (для меня этого достаточно) (я соответствующим образом отредактировал свой вопрос, чтобы сделать это более понятным). Как я уже сказал, приложение работает, просто во время выполнения rake spec происходит сбой.

Ответ №2:

Я думаю, вам, возможно, придется быть более конкретным:

 get 'home/index' => 'home#index'
  

Комментарии:

1. Из документации: edgeguides.rubyonrails.org/routing.html#http-verb-constraints У меня такое чувство, что это должно быть связано с rspec, поскольку само приложение работает.

2. Я не сомневаюсь, что это работает. Мне просто интересно, может ли у Rspec быть какая-то проблема с сокращением… Но на самом деле я просто предполагаю.

Ответ №3:

Я нашел это! Это заняло у меня некоторое время, в конце концов я изменил лог-файлы, которые видят, что происходит по-другому.

По-видимому, у меня есть файл спецификации on, где мы пытаемся протестировать базовый класс. Внутри этой спецификации мы определяем новый контроллер, производный от этого базового класса, с фиктивным методом индекса.

А также нам нужны маршруты, поэтому внутри этой спецификации должен был быть найден следующий код:

 ActionController::Routing::Routes.draw do |map|
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end
  

и почему-то эта спецификация всегда запускалась первой. Я думаю, это эффективно очищает всю конфигурацию маршрутизации.

Не уверен, вызвано ли это изменение rails3 или rspec2, в любом случае большинство моих тестов теперь работают, просто нужно исправить этот тест сейчас.