Ошибка маршрутизации при обновлении до 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).

Чтобы обойти проблему сейчас, убедитесь, что ваши имена параметров точно соответствуют вашим маршрутам.

Я предлагаю добавить соответствующие маршруты до тех пор, пока не будет решен исход по поданной проблеме. Таким образом, если это исправлено и устранено, вам просто нужно снова удалить маршруты - вместо того, чтобы возиться с производственной логикой на уровне контроллера (который уже работает без нареканий).

Другие вопросы по тегам