Как я могу проверить блоки помощников в Синатре, используя Rspec? - PullRequest
14 голосов
/ 21 мая 2010

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

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

Ответы [ 4 ]

14 голосов
/ 20 декабря 2011

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

Если вы пишете небольшую демонстрацию и определяете свои вспомогательные методы в блоке helpers { ... }, я не думаю, что тестирование абсолютно необходимо. Любое приложение sinatra, находящееся в производстве, в любом случае может потребовать большей модульности.

# 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
6 голосов
/ 05 июня 2010

На самом деле вам не нужно делать:

helpers do
  include FooBar
end

Так как вы можете просто позвонить

helpers FooBar

Метод helpers принимает список модулей для смешивания и необязательный блок, в который входит класс: https://github.com/sinatra/sinatra/blob/75d74a413a36ca2b29beb3723826f48b8f227ea4/lib/sinatra/base.rb#L920-L923

2 голосов
/ 27 мая 2010

может быть, это может вам как-то помочь http://japhr.blogspot.com/2009/03/sinatra-innards-deletgator.html

0 голосов
/ 14 июля 2010

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

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
...