gpt4 book ai didi

ruby - 如何使用 rspec/rspec-mocks stub 类方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:00 24 4
gpt4 key购买 nike

我正在使用 rspec-mock 进行测试驱动开发。我开始实现单个类并使用 rspec-mock 模拟/ stub 其他类。尚未实现的类的模拟对象效果很好。但是,当我尝试模拟一个尚不存在的类的类方法时,我没有成功。我的类“哈希”应该有一个类方法“calculate_hashes”接收文件名并返回哈希。

我试过了

 allow(Hashes).to receive(:calculate_hash) do |file| 
# looks up what to return
end

给出错误“Hashes is not a class”。然后我实现了一个类“Hashes”

class Hashes
end

然后只尝试以相同的方式对类方法进行 stub 。这给出了错误“Hashes does not implement: calculate_hash”当我将该方法添加到我的类定义中时:

class Hashes
def self.calculate_hash(filename)
end
end

它终于起作用了,我对此类方法的 stub 使用“allow(Hashes)”起作用,如上例所示。我只是想知道是否有一种方法可以在不编写此类框架的情况下完成此任务。

或者我可能试图以不恰当的方式完成某事?或者 rspec-mock 可能不是执行此操作的正确工具?

非常感谢任何帮助。

最佳答案

对于您的工作流程,我认为使用 class_double 比直接 stub Hashes 类效果更好。 allow(Hashes) 总是 要求定义Hashes 常量。这就是 Ruby 的工作方式,而 RSpec 对此无能为力。用class double ,您可以改为这样做:

class_double("Hashes", :calculate_hash => canned_return_value).as_stubbed_const

# or

hashes = class_double("Hashes").as_stubbed_const
allow(hashes).to receive(:calculate_hash) do |file|
# look up what to return
end

class_double("Hashes") 为您提供了一个测试替身,当定义了 Hashes 常量时,它将根据 验证模拟和 stub 方法Hashes 类定义,但当它未定义时,将像一个普通的 double 一样运行,允许在其上模拟或 stub 任何内容。 as_stubbed_const 位告诉 rspec-mocks 在示例期间 stub Hashes 常量,这样任何对 Hashes 的引用都会让你的类加倍比真正的 Hashes 类,即使从未定义过 Hashes 类。

关于ruby - 如何使用 rspec/rspec-mocks stub 类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30848877/

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