Хорошо, так. Я хочу сделать спецификации запросов с RSpec для моего приложения Sinatra.
У меня есть конфиг.ру
# 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 просто использует Bundler и выполняет дополнительные требования для остальной части приложения:
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
Но моя проблема в том, что я хочу протестировать «ThatApp» из моего файла рэкапа вместе с любым количеством дополнительных приложений, которые я мог бы добавить позже вместе с «ThisApp». Например, если у меня был второй файл спецификации запроса:
# 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 с помощью этого метода 'app', и я думаю, что в конечном итоге мне придётся подавать Capybara.app то же самое при выполнении дальнейших спецификаций запроса с этим.
Я чувствую, что что-то упустил, и, возможно, есть простой способ настроить «приложение» для RackTest и Capybara во время выполнения в зависимости от того, какой маршрут и последующее приложение-стойку я тестирую в своих спецификациях запросов. Может быть, как фильтр before в RSpec.configure, но я не могу придумать, как найти доступ к тому, какое стоечное приложение загружено в данный момент, и попробовать установить его там до запуска тестового набора.
Кто-нибудь понимает, что я пытаюсь сделать, и может что-то придумать? Спасибо за любую помощь.