Rails 4.2.0 ActionController::UrlGenerationError

use*_*220 5 ruby rspec ruby-on-rails rspec-rails ruby-on-rails-4

我已经升级了rails 4.2.0和spree 3.0

一旦我运行 rspec,我就会收到以下错误,它向我显示 Rails 4.2.0 中的 rspec ActionController::UrlGenerationError,我在 google 上搜索了很多,但没有找到任何解决方案,请找到以下日志:

Run options: include {:locations=>{"./spec/controllers/messages_controller_spec.rb"=>[10]}}
F

Failures:

  1) MessagesController create with valid message sends message and shows flash notice
     Failure/Error: get "contact-us"
     ActionController::UrlGenerationError:
       No route matches {:action=>"contact-us", :controller=>"messages"}
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_dispatch/journey/formatter.rb:46:in `generate'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:727:in `generate'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:758:in `generate'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:753:in `generate_extras'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:748:in `extra_keys'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_controller/test_case.rb:208:in `assign_parameters'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_controller/test_case.rb:619:in `process'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_controller/test_case.rb:65:in `process'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/devise-3.4.1/lib/devise/test_helpers.rb:19:in `block in process'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/devise-3.4.1/lib/devise/test_helpers.rb:72:in `catch'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/devise-3.4.1/lib/devise/test_helpers.rb:72:in `_catch_warden'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/devise-3.4.1/lib/devise/test_helpers.rb:19:in `process'
     # /home/rails22/.rvm/gems/ruby-2.2.0@/gems/actionpack-4.2.1/lib/action_controller/test_case.rb:508:in `get'
     # ./spec/controllers/messages_controller_spec.rb:11:in `block (4 levels) in <top (required)>'

Finished in 0.02445 seconds (files took 9.1 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/messages_controller_spec.rb:10 # MessagesController create with valid message sends message and shows flash notice
Run Code Online (Sandbox Code Playgroud)

矿井路线文件:

match 'messages/contact-us' => 'messages#contact_us', via: [:get]
Run Code Online (Sandbox Code Playgroud)

耙路由日志:

rake routes | grep "contact-us"
                                         contact_us GET    /contact-us(.:format)                                          redirect(301, /support#/contact-us)
                                            contact GET    /contact(.:format)                                             redirect(301, /support#/contact-us)
                                messages_contact_us GET    /messages/contact-us(.:format)                                 messages#contact_us
Run Code Online (Sandbox Code Playgroud)

Mar*_*c L 5

此错误是在 Spree 3.0 中引入的,该提交清理了 Spree 控制器测试指定要使用的路由的方式。您可能会看到此错误,因为您正在测试 之外的路线Spree::Core::Engine.routes,但您spec_helper.rb仍然包含此行:

config.include Spree::TestingSupport::ControllerRequests, type: :controller
Run Code Online (Sandbox Code Playgroud)

怎么修

选项1)

通过重新分配用于测试的路由来修复有问题的规范。例子:

describe MessagesController, type: :controller do
  routes { Rails.application.routes }  # <--- add this line

  describe '#index' do
    before do
      get :index
    end

    specify do
      expect(response).to be_success
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

选项2)

如果您的项目中没有任何命中 Spree 控制器的测试,或者 Spree 路由命名空间中的任何内容,您只需从项目的或中删除此行:spec/spec_helper.rbspec/rails_helper.rb

config.include Spree::TestingSupport::ControllerRequests, type: :controller
Run Code Online (Sandbox Code Playgroud)

这是怎么发生的

  • 以前,Spree 引擎路由是使用和use_route内部的参数指定的。它们不会干扰您自己的命名空间下的控制器测试。process_spree_actionprocess_spree_xhr_action
  • Rails 4.2 已弃用use_route
  • Spree 已更改为较新的版本routes { Spree::Core::Engine.routes },现在适用于包括Spree::TestingSupport::ControllerRequests.
  • 这都是因为 Rspec 的引擎支持确实很差,所以社区一直在尽最大努力让这些工具协同工作。