Модульные тесты с путешествием 1.0.4 приводят к ActionController::RoutingError: Нет совпадений с маршрутом
Ошибка маршрутизации SO-потока при обновлении до Rails 3.2.6 или Rspec 2.11.0 довольно хорошо объясняет проблему:
При переезде>= 1.0.4 (Rails 3.2.11) все модульные тесты, связанные с маршрутизацией, завершаются неудачно, а само приложение продолжает нормально функционировать.
Использование Rails 3.2.6 и блокировка перехода к 1.0.3 - это обходной путь, который стал неприемлемым.
В качестве примера приведу один из самых простых тестов, которые не пройдены:
routes.rb
ProjRails::Application.routes.draw do
devise_for :users, :controllers => {:registrations => "users/registrations"}
resources :users do
collection do
get 'current' => 'users#redirect', :as => :current
end
end
# ...
end
end
users_controller_test.rb
require 'test_helper'
class UsersControllerTest < ActionController::TestCase
setup do
@user = FactoryGirl.create(:user)
@current_user = FactoryGirl.create(:user)
sign_in @current_user
end
# ...
test "should get new" do
get :new # this is line 25
assert_response :success
end
# ...
end
трассировки стека
8) Error:
test_should_get_new(UsersControllerTest):
ActionController::RoutingError: No route matches {:controller=>"users", :action=>"new"}
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:533:in `raise_routing_error'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:529:in `rescue in generate'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:521:in `generate'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:562:in `generate'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:558:in `generate_extras'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:554:in `extra_keys'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_controller/test_case.rb:151:in `assign_parameters'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_controller/test_case.rb:463:in `process'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_controller/test_case.rb:49:in `process'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/devise-2.1.2/lib/devise/test_helpers.rb:19:in `block in process'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/devise-2.1.2/lib/devise/test_helpers.rb:71:in `catch'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/devise-2.1.2/lib/devise/test_helpers.rb:71:in `_catch_warden'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/devise-2.1.2/lib/devise/test_helpers.rb:19:in `process'
/home/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.11/lib/action_controller/test_case.rb:390:in `get'
/home/me/proj/test/functional/users_controller_test.rb:25:in `block in <class:UsersControllerTest>'
Похоже, что есть несколько связанных с этим вопросов по SO - все либо нерешенные, либо без конкретного решения.
Кто-нибудь знает, как решить эту проблему?
1 ответ
В разделе "Тестирование" rails-translate-маршруты README ( https://github.com/francesc/rails-translate-routes) объясняется, что языковой стандарт должен быть добавлен в качестве параметра для вызова действия.
get :new
должен быть изменен на что-то вроде этого:
get :new, locale: 'en'
Как указано в файле readme, существует обезьянья заплатка, чтобы избежать необходимости делать это.
Остается один вопрос: почему это работает без добавления в Rails 3.2.6 / Journey 1.0.3?