Как проверить тестовые блоки в Sinatra, используя Rspec?

Я пишу приложение sinatra и тестирую его с помощью rspec и rack/test (как описано на сайте sinatrarb.com).
Это было здорово до тех пор, пока я не переместил некоторый довольно процедурный код из моих объектов домена в помощники синатра.

С тех пор я пытался выяснить, как тестировать их изолированно?

Ответы

Ответ 2

Я тестирую своих помощников по синатре изолированно, помещая вспомогательные методы в свой собственный модуль. Поскольку мое приложение синатра немного больше, чем обычный пример приветствия, мне нужно разбить его на более мелкие части. Модуль для общих помощников подходит для моего использования.

Если вы пишете быстрое демо, и вы определяете свои вспомогательные методы в блоке 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

Ответ 4

Я также пробовал это (нужно немного очистить, чтобы его можно было повторно использовать), чтобы изолировать каждого помощника в своей собственной среде, подлежащей тестированию:

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