14

私はsinatraアプリを作成し、rspecとrack / testでテストしています(sinatrarb.comで説明されています)。
ドメインオブジェクトからsinatraヘルパーにかなり手続き型のコードを移動するまでは、これまでのところすばらしいことです。

それ以来、私はこれらを個別にテストする方法を見つけようとしてきましたか?

4

4 に答える 4

14

ヘルパーメソッドを独自のモジュール内に配置することで、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
于 2011-12-20T12:47:40.513 に答える
6

実際には、次のことを行う必要はありません。

helpers do
  include FooBar
end

ただ電話できるので

helpers FooBar

このhelpersメソッドは、ミックスインするモジュールのリストと、クラス評価されるオプションのブロックを取得します:https ://github.com/sinatra/sinatra/blob/75d74a413a36ca2b29beb3723826f48b8f227ea4/lib/sinatra/base.rb#L920- L923

于 2010-06-05T06:02:40.003 に答える
2

多分これは何らかの方法であなたを助けることができますhttp://japhr.blogspot.com/2009/03/sinatra-innards-deletgator.html

于 2010-05-26T21:37:05.670 に答える
0

また、これを試して(再利用できるようにするには少しクリーンアップする必要があります)、テストする独自の環境で各ヘルパーを分離しました。

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
于 2010-07-14T11:55:52.473 に答える