如何在Sinatra中设置Rack :: URLMap与RSpec一起使用?

时间:2013-02-06 20:53:44

标签: 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(
  '/' => HomeController.new,
  '/users' => UsersController.new(TwilioWrapper.new)
)

通过这种设置,我可以模块化我的控制器并创建辅助类的单个实例(例如TwilioWrapper)。但是,如果我想设置RSpec,我需要将它指向我的应用程序类。但是,在上面的情况中,因为我使用的是Rack :: URLMap,所以我没有指定RSpec的特定应用程序类。

如何在包含RSpec测试的同时保持我的代码模块化以上述方式?

1 个答案:

答案 0 :(得分:3)

Rack不关心控制器,它关心应用程序。所以HomeControllerUsersController是2个Sinatra应用程序在Rack中“累积”。这些不是控制器,它们是独立的Rack应用程序。我认为您不想要2个应用程序,而是将这2个控制器放在2个文件中,这样您就可以单独指定它们并保持代码可读。

Sinatra的命名惯例是将其命名为MyApp以反映这一点。 Sinatra是一个扁平框架,但您可以将“控制器”文件命名为您想要的名称。

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

MyApp < Sinatra::Application

然后你可以使用Rack::Test和Rspec进行测试。

如果你确实想要测试2个应用并想要使用Rack::Test w Rspec的前缀,你只需要在spec_helper或spec文件中定义app

 def app
  run Rack::URLMap.new(
   '/' => HomeController.new,
   '/users' => UsersController.new(TwilioWrapper.new)
  )
 end

所有Rack::Test确实将您的Sinatra应用程序放入测试容器中。

另请参阅Phrogz在how to lay out a Sinatra application

上的优秀答案