好吧。我想要爲我的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中的過濾器一樣,但我無法想象或發現我將如何訪問當前加載的機架應用程序,並在測試套件運行之前嘗試在那裏設置它。
任何人都可以得到我想要做的事情,並可以想到什麼?謝謝你的幫助。
貌似我可以簡單地包括RackTest和我個人的規格定義了應用程序的方法,並描述塊,但好像很多重複和單一spec_helper文件的點擊敗一部分。 – rjoll 2011-05-05 19:32:35