9

我正在尝试测试我的应用程序正在使用的引擎内部的控制器。规范不在引擎中,而是在应用程序本身中(我尝试在引擎中进行测试,但也遇到了问题)。

我的引擎有以下 routes.rb:

Revision::Engine.routes.draw do
  resources :steps, only: [] do
    collection { get :first }
  end
end

引擎通常安装在应用程序 routes.rb 上:

mount Revision::Engine => "revision"

当我运行rake routes时,在最后几行我得到:

Routes for Revision::Engine:
first_steps GET /steps/first(.:format) revision/steps#first
       root     /                       revision/steps#first

在我的引擎控制器 ( lib/revision/app/controllers/revision/steps_controller.rb) 上,我有:

module Revision
  class StepsController < ApplicationController
    def first
    end
  end
end

在 Rspec 上,我使用以下方法测试此控制器:

require 'spec_helper'
describe Revision::StepsController do
  it "should work" do
    get :first
    response.should be_success
  end
end

然后当我运行这个规范时,我得到:

ActionController::RoutingError:
   No route matches {:controller=>"revision/steps", :action=>"first"}

为了确保该路线并不真正存在,我将其添加到规范中:

before do
  puts @routes.set.to_a.map(&:defaults)
end

结果是这样的:

[...]
{:action=>"show", :controller=>"devise/unlocks"}
{:action=>"revision"}

它只有:action参数。

可能有什么问题?

4

1 回答 1

4

当您尝试测试引擎的控制器时,您需要指定您希望控制器测试使用的路由集,否则它将针对主应用程序运行它。为此,请传递use_route: :engine_name给该get方法。

require 'spec_helper'
describe Revision::StepsController do
  it "should work" do
    get :first, use_route: :revision # <- this is how you do it
    response.should be_success
  end
end
于 2013-08-09T22:17:14.303 回答