0

这个问题可能已经在 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

……就是这样。

4

3 回答 3

1

我找到了解决方法。在规范的顶部,我添加了以下代码:

render_views
before do
  # work around bug in routing testing
  @routes = Lightweight::Engine.routes
end

...现在规范运行没有路由错误。但我不知道为什么会这样,所以如果有人可以发布解释它的答案,我会接受。

于 2012-10-16T14:11:34.563 回答
0

添加文件 spec/routing/root_routing_spec.rb

require "spec_helper"

describe "routes for Widgets" do
  it "routes /widgets to the widgets controller" do
    { :get => "/" }.should route_to(:controller => "home", :action => "index")
  end
end

然后添加一个文件 spec/controllers/home_controller_spec.rb

require 'spec_helper'

describe HomeController do

    context "GET index" do
    before(:each) do
      get :index
    end
    it {should respond_with :success }
    it {should render_template(:index) }

   end
end  
于 2012-10-15T19:28:14.940 回答
0

我认为您的规格可能有问题

“轻量级”是如何进入这一行的:controller=>“lightweight/mw_interactives”

路线说

new_mw_interactive GET    /mw_interactives/new(.:format)

不是

new_mw_interactive GET    /lightweight/mw_interactives/new(.:format)
于 2012-10-15T19:20:11.857 回答