Ruby Cucumber говорит, что path не может найти маршрут, когда Rake Routes показывает, что он есть

У меня есть Ruby on Rails с огурцом. База данных была перенесена для тестовой среды, и я вижу ее с помощью sqliteman. Проблема в том, что в то время как rake route показывает маршруты, которые я хочу, огурец возвращает ошибку, говорящую, что маршруты не существуют.

Маршруты:

    movies GET    /movies(.:format)          {:action=>"index", :controller=>"movies"}
           POST   /movies(.:format)          {:action=>"create", :controller=>"movies"}
 new_movie GET    /movies/new(.:format)      {:action=>"new", :controller=>"movies"}
edit_movie GET    /movies/:id/edit(.:format) {:action=>"edit", :controller=>"movies"}
     movie GET    /movies/:id(.:format)      {:action=>"show", :controller=>"movies"}
           PUT    /movies/:id(.:format)      {:action=>"update", :controller=>"movies"}
           DELETE /movies/:id(.:format)      {:action=>"destroy", :controller=>"movies"}

Затем в том же окне подсказки я запускаю «bundle exec cucumber» и получаю эту ошибку в двух разных сценариях в одном и том же файле функций:

No route matches {:action=>"show", :controller=>"movies"} (ActionController::RoutingError)
No route matches {:action=>"edit", :controller=>"movies"} (ActionController::RoutingError)

Файл features/support/paths.rb не работает в двух строках, где вызываются *movie_path* и *edit_movie_path*.

when /^the details page for (.*)/
  mov= Movie.find_by_title($1)
  movie_path(mov)
when /^the edit page for (.*)/
  mov= Movie.find_by_title($1)
  edit_movie_path(mov)

Я должен был как-то разгребать маршруты в тестовую среду? Я не уверен, что мне не хватает, поскольку он «выглядит», как будто все части на месте.


person DFBerry    schedule 22.03.2012    source источник
comment
Действительно ли mov соответствует вашим ожиданиям? Или это nil?   -  person Andrew Marshall    schedule 22.03.2012
comment
Я закомментировал или удалил строки, чтобы сузить объем теста, и тест, по-видимому, все еще видит весь/неотредактированный файл. Как я должен запускать тесты, чтобы изменения вступили в силу?   -  person DFBerry    schedule 22.03.2012
comment
Уххх, нет никаких причин, по которым он не будет использовать имеющийся у вас тестовый файл, если только вы не сохранили его или не отредактировали неправильный файл.   -  person Andrew Marshall    schedule 22.03.2012
comment
Хороший улов, Андрей. Да это ноль.   -  person DFBerry    schedule 22.03.2012
comment
Добавлен ответ со способом облегчить понимание этого в будущем :).   -  person Andrew Marshall    schedule 22.03.2012


Ответы (3)


Это будет работать следующим образом:

when /the edit page for "(.*)"/
    movie= Movie.find_by_title($1)
    edit_movie_path(movie)

Но вы также можете использовать это:

   when /the edit page/
        edit_movie_path(Movie.first)
person python357    schedule 28.03.2012

Я подозреваю, что Movie.find_by_title($1) не находит ничего, как вы ожидаете, в то время как mov оказывается nil, и поэтому он не может найти маршрут к нему, поскольку нет идентификатора.

Вы можете сделать это более очевидным, добавив ! к find_by_title, чтобы он вызывал исключение, когда ничего не было найдено:

when /^the details page for (.*)$/
  movie = Movie.find_by_title!($1)
  edit_movie_path(mov)
end
person Andrew Marshall    schedule 22.03.2012

edit_movie GET    /movies/:id/edit(.:format) {:action=>"edit", :controller=>"movies"}

{:action=>"edit", :controller=>"movies"} здесь относится к controller и action, относящимся к этому маршруту. Но вам понадобится параметр :id, чтобы правильно создать путь к этому маршруту.

No route matches {:action=>"show", :controller=>"movies"}

{:action=>"edit", :controller=>"movies"} здесь относится к параметрам, заданным при попытке создать путь для маршрута.

Я бы убедился, что ваш mov не равен нулю и возвращает правильную запись Movie.

person nowk    schedule 22.03.2012