我对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测试的同时保持我的代码模块化以上述方式?
答案 0 :(得分:3)
Rack不关心控制器,它关心应用程序。所以HomeController
和UsersController
是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
上的优秀答案