在 Rails 规范中安装其他路由

Mount additional routes in Rails specs

我想测试嵌入 javascript 小部件(由我的 Rails 应用程序提供)并向我的 rails 应用程序中的端点提交表单的第三方网站。

为此,我创建了一个我用 Capybara 测试的虚拟 sinatra 应用程序:

# spec/system/widget_spec.rb

require 'sinatra/base'
class DummyApp < Sinatra::Base
  get '/form' do
    @widget_code = params[:widget_code]
    erb :form
  end
end

require 'rails_helper'

...

我正在定义此应用 之前 Rails 已加载到我的规范中,以便我可以在 routes.rb 中执行以下操作:

mount DummyApp => '/dummy' if defined? DummyApp

如果我 运行 只有这一个规范,这会起作用,但如果我 运行 整个套件, Rails 在我的 DummyApp 定义之前加载。

理想情况下,我想将此行完全从 routes.rb 中删除,并允许我的测试注入自定义路由,这样我的路由文件就不会被与测试相关的路由弄得乱七八糟。

1) 有没有办法在测试中修改 rails 路由?

2) 如果不是,测试此类场景的最佳方法是什么?

有一个助手 with_routing 你可以使用 (docs):

with_routing do |set|
  set.draw do
    mount DummyApp => '/dummy'
  end
  # ...
end