2010-05-21 55 views
13

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

从那时起,我一直在试图弄清楚如何单独测试这些东西?

回答

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 
12

我通过将测试我西纳特拉佣工隔离辅助方法在它自己的模块中。 由于我的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