这个问题可能已经在 Stack Overflow 上被问过十几次(例如(1)、(2)、(3)、(4)、(5)),但每次答案似乎都不同,而且没有一个对我有帮助. 我正在使用 Rails 引擎,发现 Rspec2 出现路由错误,但我可以在浏览器中访问路由。情况如下:
在引擎中
routes.rb
:resources :mw_interactives, :controller => 'mw_interactives', :constraints => { :id => /\d+/ }, :except => :show # This is so we can build the InteractiveItem at the same time as the Interactive resources :pages, :controller => 'interactive_pages', :constraints => { :id => /\d+/ }, :only => [:show] do resources :mw_interactives, :controller => 'mw_interactives', :constraints => { :id => /\d+/ }, :except => :show end
摘录输出
rake routes
:new_mw_interactive GET /mw_interactives/new(.:format) lightweight/mw_interactives#new {:id=>/\d+/} ... new_page_mw_interactive GET /pages/:page_id/mw_interactives/new(.:format) lightweight/mw_interactives#new {:id=>/\d+/, :page_id=>/\d+/}
而我的测试,来自控制器规格之一(
describe Lightweight::MwInteractivesController do
):it 'shows a form for a new interactive' do get :new end
...得到这个结果:
Failure/Error: get :new
ActionController::RoutingError:
No route matches {:controller=>"lightweight/mw_interactives", :action=>"new"}
...但是当我在浏览器中转到该路线时,它完全按预期工作。
我在这里想念什么?
ETA:澄清 Andreas 提出的一点:这是一个 Rails 引擎,因此 rspec 在一个虚拟应用程序中运行,该应用程序在命名空间中包含引擎的路由:
mount Lightweight::Engine => "/lightweight"
...因此显示的路线rake routes
以/lightweight/
. 这就是为什么 Rspec 错误中显示的路线似乎与rake routes
. 但这确实使调试变得更加困难。
ETA2:回答 Ryan Clark 的评论,这是我正在测试的操作:
module Lightweight
class MwInteractivesController < ApplicationController
def new
create
end
……就是这样。