通过此处的其他类似问题进行搜索,它们似乎都与某种格式错误的请求有关(不提供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错误的错误是非常无益的。我非常感谢任何其他想法。
答案 0 :(得分:1)
事实证明,问题在于控制器是gem的一部分,默认情况下不包括访问控制器的路径。
通过将routes { Spaceman::Engine.routes }
添加到主describe
块的顶部内部来解决此问题。
离开单一路线并且其他一切设置正确都没关系。只需要包括路线。
答案 1 :(得分:0)
您在路线中使用单数resource
,但您的规格要求使用复数形式“reputation_enhancement s ”。
请参阅Rails问题跟踪器中的this bit in the routing guide for singular resources和this long standing issue,它解释了让url_for
映射回单一资源的好方法。
要解决此问题,请在规范中指定路径或添加复数路线。