【问题标题】:Rails 5 Rspec ActionController::UrlGenerationErrorRails 5 Rspec ActionController::UrlGenerationError
【发布时间】:2017-07-25 16:15:35
【问题描述】:

在这里搜索了其他类似的问题,它们似乎都与某种格式错误的请求有关(未提供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 错误的错误非常无益。如果有任何其他想法,我将不胜感激。

【问题讨论】:

标签: ruby-on-rails ruby rspec


【解决方案1】:

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

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

离开单一路线一切都很好,其他一切都已正确设置。只需包含路线即可。

【讨论】:

  • 谢谢,routes { Rails.application.routes } 工作。有没有方便的方法来做到这一点?为所有 describe 块添加这个很烦人。
  • 嗯。我没有深入了解,对不起。我确实有一种方法可以在 rspec 中配置某种选项以自动设置它。
【解决方案2】:

您在路由中使用单数 resource,但您的规范要求使用复数形式“reputation_enhancements”。

请参阅 Rails 问题跟踪器中的 this bit in the routing guide for singular resources 和 this long standing issue,它们解释说没有好的方法可以让 url_for 映射回单一资源。

要解决它,请在规范中指定路径或添加复数路由。

【讨论】:

  • 要求复数形式的规范在哪里?即使使用单数路由,控制器也应该是复数形式,如果这就是您所指的 - 所以我不确定复数形式在哪里搞砸了?
  • 将控制器的所有引用切换为单数(通过在路由中手动分配控制器),问题仍然存在。
  • @Rockster160 我为你添加了更多信息。
  • 我在使用复数资源时遇到了同样的问题。 (切换到不同的控制器尝试测试,但仍然失败并出现相同的错误)
  • 有没有办法在我的规范中指定路径?我找不到手动添加路径的方法。我已将路线设为复数,我已尝试将控制器设为单数,我已阅读您评论的另一篇文章但没有取得任何进展。 (他们的问题再​​次是无效的路由语法——就像我见过的大多数其他帖子一样)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
相关资源
最近更新 更多