2017-07-25 144 views
1

在這裏搜索了其他類似的問題,它們似乎都與某種格式錯誤的請求有關(不提供id,或者不包括params正確),但那些不似乎是我遇到的問題。Rails 5 Rspec ActionController :: UrlGenerationError

這條路線絕對存在,去瀏覽器中的路由工作得很好。頁面加載,一切。但是由於某種原因,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

這實際上是一個重複的:https://stackoverflow.com/questions/40978962/testing-singular-resource-controller-with-rspec – coreyward

回答

1

原來,問題在於控制器是寶石的一部分,訪問控制器的路由默認不包含在內。

通過將routes { Spaceman::Engine.routes }添加到主describe塊的頂部內來解決。

離開單數路線並且所有其他設置都正確設置都很好。只需要包含路線。

+0

感謝,'routes {Rails.application.routes}'工作。有沒有一個方便的方法來做到這一點?把所有的'describe'塊加入這個很麻煩。 – HFX

+0

嗯。我沒有更深入,我很抱歉。我確實有一種方法可以在rspec中配置某種選項來自動設置。 – Rockster160

0

您在路線中使用單數resource,但您的規格要求複數形式「reputation_enhancement s」。

請參閱this bit in the routing guide for singular resourcesthis long standing issue在Rails問題跟蹤器中解釋說,沒有好方法可以讓url_for映射回單一資源。

要解決它,請在規範中指定路徑或添加複數路線。

+0

請求複數形式的規範在哪裏?控制器應該是多元化的,即使是單獨的路線,如果這就是你所指的 - 所以我不確定複數是在哪裏搞砸了? – Rockster160

+0

將所有對控制器的引用切換爲單數(通過在路由中手動分配控制器)並且問題仍然存在。 – Rockster160

+0

@ Rockster160我爲你增加了更多信息。 – coreyward

相關問題