2013-02-06 81 views
2

我對Sinatra比較陌生,我想找出一種將RSpec與我的Sinatra設置集成的方法。如何設置Rack :: URLMap與Sinatra中的RSpec配合使用?

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進行測試?

回答

2

機架不關心控制器,它關心的應用程序。因此,HomeControllerUsersController是2個Sinatra應用程序在機架中「架起」。這些不是控制器,它們是獨立的Rack應用程序。我不認爲你需要2個應用程序,而是把這2個控制器放在2個文件中,這樣你就可以單獨指定它們並保持代碼可讀。

Sinatra的命名約定是將其命名爲MyApp來反映這一點。 Sinatra是一個扁平的框架,但你可以將你的「控制器」文件命名爲你想要的。

所以在文件夾routes你可以有「users.rb的」和「home.rb」,但兩個文件都在頂部

MyApp < Sinatra::Application 

然後你就可以測試使用Rack::Test使用RSpec。

如果你確實想測試2級的應用程序,並想用Rack::Test瓦特Rspec的,你只需要在你的spec_helper或規範文件來定義app爲前綴:

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

所有Rack::Test不被rackup您西納特拉的應用進入測試容器。

另請參閱Phrogz的出色答案how to lay out a Sinatra application

+0

很好的解釋。我認爲我最終需要的是一個示例Sinatra應用程序的鏈接。我會做一些重構,我應該很好去。 –

相關問題