ruby-on-rails – Rails引擎:rake路由显示其路由但是在rspec执行时“没有路由匹配”被抛出

我正在尝试测试我的应用程序正在使用的引擎内部的控制器.规范不在引擎内,而是在应用程序本身(我试图在引擎内测试但也有问题).

我的引擎有以下路由.rb:

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

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

mount Revision::Engine => "revision"

当我运行rake路线时,在最后一行我得到:

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参数.

可能有什么不对?

解决方法

当您尝试测试引擎的控制器时,您需要指定希望控制器测试使用的路由集,否则它将针对主应用程序运行它.为此,请将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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...