3

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

配置.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 进行测试的同时以上述方式保持代码模块化?

4

1 回答 1

3

Rack 不关心控制器,它关心应用程序。2 个 Sinatra 应用程序在 Rack 中“架起”也是HomeController如此。UsersController这些不是控制器,它们是独立的 Rack 应用程序。我不认为您想要 2 个应用程序,而是将这 2 个控制器放在 2 个文件中,以便您可以分别指定它们并保持代码可读。

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

所以在文件夹中routes你可以有'users.rb'和'home.rb'但两个文件都在顶部

MyApp < Sinatra::Application

然后您可以使用Rack::TestRspec 进行测试。

如果您确实想测试 2 个应用程序并希望使用Rack::Testw Rspec 前缀,您只需app在您的 spec_helper 或 spec 文件中定义为:

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

所做的只是将你Rack::Test的 Sinatra 应用程序打包到一个测试容器中。

另请参阅 Phrogz 关于如何布置 Sinatra 应用程序的出色答案

于 2013-02-06T21:37:30.107 回答