我正在編寫一個sinatra應用程序並使用rspec和rack/test進行測試(如sinatrarb.com上所述)。
直到我將一些相當程序化的代碼從我的域對象移動到 sinatra助手之前,它一直很棒。如何使用Rspec測試Sinatra中的助手塊?
從那時起,我一直在試圖弄清楚如何單獨測試這些東西?
我正在編寫一個sinatra應用程序並使用rspec和rack/test進行測試(如sinatrarb.com上所述)。
直到我將一些相當程序化的代碼從我的域對象移動到 sinatra助手之前,它一直很棒。如何使用Rspec測試Sinatra中的助手塊?
從那時起,我一直在試圖弄清楚如何單獨測試這些東西?
其實你並不需要做:
helpers do
include FooBar
end
既然你可以叫
helpers FooBar
的helpers
方法接受一個列表的混合模塊和一個可選模塊,可以在以下類別中評估: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
我通過將測試我西納特拉傭工隔離輔助方法在它自己的模塊中。 由於我的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
確實,我去那'路線',運作良好:oP 謝謝zed。 – julien 2010-05-27 08:46:15