如何使用Rspec在Sinatra中测试助手块?

我正在编写一个sinatra应用程序并使用rspec和rack / test进行测试(如sinatrarb.com所述)。
到目前为止,它一直很棒,直到我将一些相当程序性的代码从我的域对象移动到sinatra助手。

从那时起,我一直在试图弄清楚如何孤立地测试这些?

也许这可以帮助你某种方式http://japhr.blogspot.com/2009/03/sinatra-innards-deletgator.html

我通过将辅助方法放在自己的模块中来单独测试我的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 

其实你不需要这样做:

 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