Ответ 1
Возможно, это может помочь вам каким-то образом http://japhr.blogspot.com/2009/03/sinatra-innards-deletgator.html
Я пишу приложение sinatra и тестирую его с помощью rspec и rack/test (как описано на сайте sinatrarb.com).
Это было здорово до тех пор, пока я не переместил некоторый довольно процедурный код из моих объектов домена в
помощники синатра.
С тех пор я пытался выяснить, как тестировать их изолированно?
Возможно, это может помочь вам каким-то образом http://japhr.blogspot.com/2009/03/sinatra-innards-deletgator.html
Я тестирую своих помощников по синатре изолированно, помещая вспомогательные методы в свой собственный модуль. Поскольку мое приложение синатра немного больше, чем обычный пример приветствия, мне нужно разбить его на более мелкие части. Модуль для общих помощников подходит для моего использования.
Если вы пишете быстрое демо, и вы определяете свои вспомогательные методы в блоке helpers { ... }
, я не думаю, что тестирование абсолютно необходимо. Любое приложение-синатра в производстве, возможно, потребует большей модульности.
# in helpers.rb
module Helpers
def safe_json(string)
string.to_s.gsub(/[&><']/) { |special| {'&' => '\u0026', '>' => '\u003E', '<' => '\u003C', "'" => '\u0027'}[special] }
end
end
# in app.rb
helpers do
include Helpers
end
# in spec/helpers_spec.rb
class TestHelper
include Helpers
end
describe 'Sinatra helpers' do
let(:helpers) { TestHelper.new }
it "should escape json to inject it as a html attribute"
helpers.safe_json("&><'").should eql('\u0026\u003E\u003C\u0027')
end
end
На самом деле вам не нужно делать:
helpers do
include FooBar
end
Так как вы можете просто позвонить
helpers FooBar
Метод helpers
принимает список модулей для микширования и необязательный блок, который имеет класс-eval'd: https://github.com/sinatra/sinatra/blob/75d74a413a36ca2b29beb3723826f48b8f227ea4/lib/sinatra/base.rb#L920-L923
Я также пробовал это (нужно немного очистить, чтобы его можно было повторно использовать), чтобы изолировать каждого помощника в своей собственной среде, подлежащей тестированию:
class SinatraSim
def initialize
...set up object here...
end
end
def helpers(&block)
SinatraSim.class_eval(&block)
end
require 'my/helper/definition' # defines my_helper
describe SinatraSim do
subject { SinatraSim.new(setup) }
it "should do something"
subject.expects(:erb).with(:a_template_to_render) # mocha mocking
subject.my_helper(something).should == "something else"
end
end