Rails 5 Rspec ActionController :: UrlGenerationError

时间:2017-07-25 16:15:36

标签: ruby-on-rails ruby rspec

通过此处的其他类似问题进行搜索,它们似乎都与某种格式错误的请求有关(不提供id,或者没有正确包含参数)但是那些看起来不太合适成为我遇到的问题。

路线肯定存在,在浏览器中路由工作正常。页面加载,一切。但是由于某些原因,Rspec给了我一个UrlGenerationError。

我尝试在路线中手动指定控制器名称,更改为复数控制器,甚至使用不同的(复数)控制器。它似乎在某个地方存在某些其他配置的问题,但是它的URLGeneration错误的错误是非常无益的。我非常感谢任何其他想法。

我们的应用程序中的API控制器规格似乎运行正常,但我无法区分这些与此之间的设置。

我的错误:

  1) Spaceman::ReputationEnhancementsController GET show has a 200 status code
     Failure/Error: get :show

     ActionController::UrlGenerationError:
       No route matches {:action=>"show", :controller=>"spaceman/reputation_enhancements"}
     # ./spec/controllers/spaceman/reputation_enhancements_controller_spec.rb:10:in `block (3 levels) in <top (required)>'

Finished in 1.14 seconds (files took 6.13 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/spaceman/reputation_enhancements_controller_spec.rb:9 # Spaceman::ReputationEnhancementsController GET show has a 200 status code

路线:

Spaceman::Engine.routes.draw do
  resource :reputation_enhancement, path: "reputation-enhancement", only: [ :show, :create ] do
    get :filter
  end
end

测试:(我已尝试在此处添加type: :controller,以及完全符合条件,添加Rspec.describe等等...)

require "rails_helper"

describe Spaceman::ReputationEnhancementsController do

  describe "GET show" do
    it "has a 200 status code" do
      get :show
      expect(response.status).to eq(200)
    end
  end

end

rake routes

filter_reputation_enhancement GET    /reputation-enhancement/filter(.:format) spaceman/reputation_enhancements#filter
       reputation_enhancement GET    /reputation-enhancement(.:format)        spaceman/reputation_enhancements#show
                              POST   /reputation-enhancement(.:format)        spaceman/reputation_enhancements#create

编辑:

我尝试在路线中手动指定控制器名称,更改为复数控制器,甚至使用不同的(复数)控制器。它似乎在某个地方存在某些其他配置的问题,但是它的URLGeneration错误的错误是非常无益的。我非常感谢任何其他想法。

2 个答案:

答案 0 :(得分:1)

事实证明,问题在于控制器是gem的一部分,默认情况下不包括访问控制器的路径。

通过将routes { Spaceman::Engine.routes }添加到主describe块的顶部内部来解决此问题。

离开单一路线并且其他一切设置正确都没关系。只需要包括路线。

答案 1 :(得分:0)

您在路线中使用单数resource,但您的规格要求使用复数形式“reputation_enhancement s ”。

请参阅Rails问题跟踪器中的this bit in the routing guide for singular resourcesthis long standing issue,它解释了让url_for映射回单一资源的好方法。

要解决此问题,请在规范中指定路径或添加复数路线。