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 回答