我正在编写一个sinatra应用程序并使用rspec和rack / test进行测试(如sinatrarb.com所述)。
到目前为止,它一直都很棒,直到我将一些相当程序化的代码从我的域对象移动到
sinatra帮助者。
从那时起,我一直试图弄清楚如何孤立地测试这些?
答案 0 :(得分: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
答案 1 :(得分:6)
其实你不需要这样做:
helpers do
include FooBar
end
因为你可以打电话
helpers FooBar
helpers
方法将一个模块列表混合在一起,一个可选的块在class {eval'd:https://github.com/sinatra/sinatra/blob/75d74a413a36ca2b29beb3723826f48b8f227ea4/lib/sinatra/base.rb#L920-L923
答案 2 :(得分:2)
答案 3 :(得分: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