在Sinatra中工作,创建了一个本地对象request
,并使其可供所有视图和帮助者使用。所以,我可以使用辅助方法创建一个ApplicationHelper
模块,如果在视图中调用了辅助方法,它们又可以调用request
对象,如下所示:
module ApplicationHelper
def nav_link_to(text,path)
path == request.path_info ? klass = 'class="current"' : klass = ''
%Q|<a href="#{path}" #{klass}>#{text}</a>|
end
end
现在,我想测试一下,但在我的测试中,request
对象不存在。我试图嘲笑它,但那没用。到目前为止,这是我的测试:
require 'minitest_helper'
require 'helpers/application_helper'
describe ApplicationHelper do
before :all do
@helper = Object.new
@helper.extend(ApplicationHelper)
end
describe "nav links" do
before :each do
request = MiniTest::Mock.new
request.expect :path_info, '/'
end
it "should return a link to a path" do
@helper.nav_link_to('test','/test').must_equal '<a href="/test">test</a>'
end
it "should return an anchor link to the current path with class 'current'" do
@helper.nav_link_to('test','/').must_equal '<a href="test" class="current">test</a>'
end
end
end
那么,你怎么能模拟一个'本地'对象,以便测试可以调用它的代码?
答案 0 :(得分:2)
您需要确保request
对象上有@helper
方法返回模拟请求对象。
在RSpec中我只是存根。我对Minitest并不是特别熟悉,但快速查看表明这可能适用于最新版本(如果您在request
中将@request
更改为before :each
):
it "should return a link to a path" do
@helper.stub :request, @request do
@helper.nav_link_to('test','/test').must_equal '<a href="/test">test</a>'
end
end
<强>更新强>
由于Minitest要求已在对象上定义了存根方法,因此您可以使@helper
成为Struct.new(:request)
的实例,而不是Object
,即
@helper = Struct.new(:request).new
实际上,完成后,你可能根本不需要存根!你可以做到
before :each do
@helper.request = MiniTest::Mock.new
@helper.request.expect :path_info, '/'
end