Ruby 如何设置Rack::URLMap与Sinatra中的RSpec一起工作?

Ruby 如何设置Rack::URLMap与Sinatra中的RSpec一起工作?,ruby,testing,rspec,sinatra,rack,Ruby,Testing,Rspec,Sinatra,Rack,我对Sinatra比较陌生,我想找出一种方法将RSpec与我的Sinatra设置集成 config.ru require 'sinatra' require 'mongoid' require 'uri' require './lib/twilio_wrapper' Mongoid.load!("./config/mongoid.yml") Dir["./controllers/*.rb"].each { |file| require file } run Rack::URLMap.new

我对Sinatra比较陌生,我想找出一种方法将RSpec与我的Sinatra设置集成

config.ru

require 'sinatra'
require 'mongoid'
require 'uri'
require './lib/twilio_wrapper'

Mongoid.load!("./config/mongoid.yml")

Dir["./controllers/*.rb"].each { |file| require file }

run Rack::URLMap.new(
  '/' => HomeController.new,
  '/users' => UsersController.new(TwilioWrapper.new)
)
通过这个设置,我可以模块化我的控制器并创建助手类的单个实例(比如TwilioWrapper)。但是,如果我想设置RSpec,我需要将它指向我的应用程序的类。但是,在上面的情况下,因为我使用的是Rack::URLMap,所以我没有特定的应用程序类来指向RSpec


如何以上述方式保持代码模块化,同时将RSpec用于测试?

Rack不关心控制器,它关心应用程序。因此,
HomeController
UsersController
是机架中的两个Sinatra应用程序。这些不是控制器,它们是独立的机架应用程序。我不认为您需要两个应用程序,而是将这两个控制器放在两个文件中,这样您就可以分别指定它们,并保持代码可读性

Sinatra的命名约定是将其命名为类似于
MyApp
,以反映这一点。Sinatra是一个平面框架,但您可以根据需要命名“控制器”文件

因此,在文件夹
routes
中,您可以有“users.rb”和“home.rb”,但这两个文件都位于顶部

MyApp < Sinatra::Application
所有
Rack::Test
所做的就是将您的Sinatra应用程序装入一个测试容器中


另外,请参见Phrogz关于

精彩解释的精彩回答。我想我最终真正需要的是指向Sinatra应用程序示例的链接。我要做一点重构,我应该很乐意去做。
 def app
  run Rack::URLMap.new(
   '/' => HomeController.new,
   '/users' => UsersController.new(TwilioWrapper.new)
  )
 end