Ошибка маршрутизации при обновлении до Rails 3.2.6 или Rspec 2.11.0
После обновления до Rails 3.2.6 или Rspec 2.11.0 мои спецификации начинают показывать ошибки маршрутизации, подобные следующим:
4) UsersController GET activate activation code not exist
Failure/Error: subject{ get :activate }
ActionController::RoutingError:
No route matches {:controller=>"users", :action=>"activate"}
Существует также после каждой ошибки хука
An error occurred in an after(:each) hook
RSpec::Mocks::MockExpectationError: (#<EmailSubscriber[...]>).update_attributes({:enable=>true})
expected: 1 time
received: 0 times
occurred at [...]/spec/controllers/users_controller_spec.rb:75:in `block (3 levels) in <top (required)>'
Приложение в режиме разработки по-прежнему работает нормально.
2 ответа
И Rspec 2.11.0, и Rails 3.2.6 используют новейшую версию Journey (1.0.4). У него есть некоторые проблемы, и при явной блокировке его к предыдущей версии ошибка спецификации исчезает.
gem 'journey', '1.0.3'
ОБНОВИТЬ
Я недавно обновил Rails до 3.2.11 с Journey 1.0.4, и все спецификации прошли. Мой Rspec - 2.11.0. Поэтому больше не нужно останавливать путешествие, просто обновите Rails.
Похоже, что среда в функциональных тестах более жесткая, чем в производстве или разработке.
В последних двух он не может "знать" имена параметров заранее, так как они определяются путем просмотра соответствующего / соответствующего определения маршрута.
В тесте, однако, каждый предоставляет имя параметра явно. Это позволяет окружающей среде быть более требовательной.
Поскольку это поведение отходит от принципа, согласно которому test-env должен максимально точно соответствовать prod-env, я считаю это ошибкой и, соответственно, подал проблему ( https://github.com/rails/journey/issues/59).
Чтобы обойти проблему сейчас, убедитесь, что ваши имена параметров точно соответствуют вашим маршрутам.
Я предлагаю добавить соответствующие маршруты до тех пор, пока не будет решен исход по поданной проблеме. Таким образом, если это исправлено и устранено, вам просто нужно снова удалить маршруты - вместо того, чтобы возиться с производственной логикой на уровне контроллера (который уже работает без нареканий).