Как настроить RSpec с Sinatra для динамического определения, какое приложение Sinatra запущено до запуска моего набора тестов? - PullRequest
3 голосов
/ 05 мая 2011

Хорошо, так. Я хочу сделать спецификации запросов с 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, но я не могу придумать, как найти доступ к тому, какое стоечное приложение загружено в данный момент, и попробовать установить его там до запуска тестового набора.

Кто-нибудь понимает, что я пытаюсь сделать, и может что-то придумать? Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Определите разные вспомогательные модули для каждого приложения sinatra, которое вы хотите протестировать, каждое из которых должно определить свой собственный метод app, который возвращает соответствующее приложение. Затем вы можете просто include MySinatraAppHelper в соответствующих группах примеров, где вы хотите протестировать данное приложение.

Вы также можете использовать метаданные rspec для автоматического включения модуля в группы примеров.

0 голосов
/ 06 мая 2011

Посмотрите на мой sinatra-rspec-bundler-template . Особенно в спецификациях. Я думаю, что это то, что вы пытаетесь достичь.

Он сочетает в себе два отдельных приложения Sinatra, каждое со своими спецификациями.

...