gpt4 book ai didi

Ruby:模拟一个本地对象来测试模块方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:03 26 4
gpt4 key购买 nike

在 Sinatra 中,本地对象 request 被创建并可供所有 View 和助手使用。所以,我可以制作一个带有辅助方法的 ApplicationHelper 模块,如果在 View 中调用辅助方法,它们可以依次调用 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 对象不存在。我试图 mock 它,但那没有用。到目前为止,这是我的测试:

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

那么,您如何模拟“本地”对象以便您的测试代码可以调用它?

最佳答案

您需要确保在您的 @helper 对象上有一个 request 方法返回模拟请求对象。

在 RSpec 中,我只是将其 stub 。我对 Minitest 不是特别熟悉,但快速浏览一下表明这可能适用于最近的版本(如果您将 request 更改为 @request 在您的 before 中:每个):

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 要求 stub 方法已经在对象上定义,您可以使 @helper 成为 Struct.new(:request) 的实例而不是 对象,即

@helper = Struct.new(:request).new

实际上,这样做之后,您可能根本不需要 stub !你可以这样做

before :each do
@helper.request = MiniTest::Mock.new
@helper.request.expect :path_info, '/'
end

关于Ruby:模拟一个本地对象来测试模块方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com