Использование огурца с модульными приложениями Sinatra - PullRequest
3 голосов
/ 20 марта 2010

Я создаю приложение среднего размера, используя Sinatra, и все было хорошо, когда у меня был один файл app.rb, и я следовал указаниям Аслака в отношении Github:

http://wiki.github.com/aslakhellesoy/cucumber/sinatra

Поскольку приложение стало немного больше, а файл app.rb начал увеличиваться в объеме, я реорганизовал множество битов в модули в стиле «промежуточного программного обеспечения», используя Sinatra :: Base, отображая вещи с помощью файла рэка ( config.ru) и т. д.

Приложение работает хорошо - но мои спецификации взорвались, так как больше не было файла app.rb для работы с webrat (как определено в ссылке выше).

Я пытался найти примеры того, как это сделать, и я думаю, что я просто еще не привык к внутренним внутренностям Cuke, поскольку не могу найти единого способа, чтобы он охватывал все приложения. Я попытался просто указать на «config.ru» вместо app.rb - но это не сработало.

То, что я в конечном итоге сделал - и это совершенно хакерство - это наличие отдельного файла app.rb в моей директории поддержки, в котором есть все необходимое, чтобы я мог, по крайней мере, протестировать материал модели. Я также могу указать там маршруты, но это совсем не то, что я хочу сделать.

Итак, вопрос: как я могу заставить Cucumber правильно работать с модульным подходом к приложениям?

Ответы [ 3 ]

2 голосов
/ 20 марта 2010

Спасибо мистеру Барокко Бобкату - теперь ответ, конечно, кажется чертовски очевидным :). Вот env.rb (/features/support/env.rb):

require 'sinatra'
require 'test/unit'
require 'spec/expectations'
require 'rack/test'
require 'webrat'
require 'app1'
require 'app2'
require 'app3'

Webrat.configure do |config|
  config.mode = :rack
end

class MyWorld
  require 'test/unit'

  set :environment, :test

  include Rack::Test::Methods
  include Webrat::Methods
  include Webrat::Matchers

  Webrat::Methods.delegate_to_session :response_code, :response_body, :response

  def app
    Rack::Builder.new do
      map '/' do
        run App1 #important - this is the class name
      end
      map '/app1' do
        run App2
      end
      map '/app2' do
        run App3
      end
    end
  end
end

World do
  MyWorld.new

end
2 голосов
/ 20 марта 2010

Обновление включает в себя работу с несколькими приложениями Sinatra

Требуется файл, где ваше приложение собирается вместе и измените

  def app
    Sinatra::Application
  end

до

 def app
    Rack::Builder.new do
      map '/a' { run MyAppA }
      map '/b' { run MyAppB }
    end
  end

и просто протестируйте приложение.

Например, если вы определили промежуточное программное обеспечение в своем config.ru, которое хотите протестировать, возможно, переместите загрузку в определение вашего приложения.

0 голосов
/ 21 апреля 2010

https://gist.github.com/28d510d9fc25710192bc

def app
  eval "Rack::Builder.new {( " + File.read(File.dirname(__FILE__) + '/../config.ru') + "\n )}"
end
...