2011-05-05 47 views
3

好吧。我想要爲我的Sinatra應用程序使用RSpec做請求規格。如何配置RSpec和Sinatra以在我的測試套件運行之前動態確定哪個Sinatra應用程序正在運行?

我有一個config.ru

# config.ru 
require File.dirname(__FILE__) + '/config/boot.rb' 

map 'this_route' do 
    run ThisApp 
end 

map 'that_route' do 
    run ThatApp 
end 

的的boot.rb只是使用捆紮機和不附加要求的應用程序的其餘部分:

ThisApp樣子:

# lib/this_app.rb 

class ThisApp < Sinatra::Base 
    get '/hello' do 
    'hello' 
    end 
end 

所以我使用RSpec,我想寫請求規格,如:

# spec/requests/this_spec.rb 
require_relative '../spec_helper' 

describe "This" do 
    describe "GET /this_route/hello" do 
    it "should reach a page" do 
     get "/hello" 
     last_response.status.should be(200) 
     end 
    end 

    it "should reach a page that says hello" do 
     get "/hello" 
     last_response.body.should have_content('hello') 
     end 
    end 
    end 
end 

這工作得很好,因爲我的spec_helper.rb的設置如下:

# spec/spec_helper.rb 
ENV['RACK_ENV'] = "test" 
require File.expand_path(File.dirname(__FILE__) + "/../config/boot") 
require 'capybara/rspec' 

RSpec.configure do |config| 
    config.include Rack::Test::Methods 
end 

def app 
    ThisApp 
end 

但我的問題是,我想從我的rackup文件來測試「ThatApp」以及任何數量更多的應用程序,我可能以後一起添加與「ThisApp」。例如,如果我有第二個請求spec文件:

# spec/requests/that_spec.rb 
require_relative '../spec_helper' 

describe "That" do 
    describe "GET /that_route/hello" do 
    it "should reach a page" do 
     get "/hello" 
     last_response.status.should be(200) 
     end 
    end 

    it "should reach a page that says hello" do 
     get "/hello" 
     last_response.body.should have_content('hello') 
     end 
    end 
    end 
end 

RackTest需要機架應用我測試在與「應用」方法spec_helper文件中定義,我想最終我將有爲Capybara.app提供同樣的東西以及在進一步的請求規格時也是如此。

我覺得我錯過了一些東西,也許有一種簡單的方法可以在運行時爲RackTest和Capybara設置「應用程序」,具體取決於我在請求規格中測試的路線和隨機機架應用程序。也許像RSpec.configure中的過濾器一樣,但我無法想象或發現我將如何訪問當前加載的機架應用程序,並在測試套件運行之前嘗試在那裏設置它。

任何人都可以得到我想要做的事情,並可以想到什麼?謝謝你的幫助。

+0

貌似我可以簡單地包括RackTest和我個人的規格定義了應用程序的方法,並描述塊,但好像很多重複和單一spec_helper文件的點擊敗一部分。 – rjoll 2011-05-05 19:32:35

回答

1

定義不同的輔助模塊要測試的每個應用程序西納特拉,每一個應該定義自己的app方法,返回對應的應用程序。然後,您可以在想要測試給定應用程序的適當示例組中簡單地使用include MySinatraAppHelper。您也可以使用rspec metadata將模塊自動包含在示例組中。

0

看看我的sinatra-rspec-bundler-template。特別是在規格文件。我想這就是你想要達到的目標。

它結合了兩個獨立的Sinatra應用程序,每個應用程序都有自己的規格。

相關問題