首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用rspec/rspec-mocks来存根类方法

如何使用rspec/rspec-mocks来存根类方法
EN

Stack Overflow用户
提问于 2015-06-15 23:18:47
回答 1查看 10.2K关注 0票数 8

我正在使用rspec-mock进行测试驱动开发。我开始实现单个类,并使用rspec-mock模拟/存根其他类。模拟尚未实现的类的对象效果很好。然而,当我试图模拟一个还不存在的类的类方法时,我并没有成功。我的类“hash”应该有一个类方法"calculate_hashes“,它接收一个文件名并返回一个散列。

我试过了

代码语言:javascript
复制
 allow(Hashes).to receive(:calculate_hash) do |file| 
      # looks up what to return
 end

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

代码语言:javascript
复制
class Hashes
end

然后只尝试以相同的方式来存根类方法。当我将这个方法添加到我的类定义中时,这会给出错误"Hashes not implement: calculate_hash“:

代码语言:javascript
复制
class Hashes
    def self.calculate_hash(filename)
    end
end

它终于起作用了,我的这个类方法的存根使用"allow(Hashes)“起作用,如上面的例子所示。我只是想知道是否有一种方法可以在不编写这个类框架的情况下实现这一点。

或者我可能试图以一种不适当的方式完成某件事?或者rspec-mock可能不是做这件事的正确工具?

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-15 23:46:22

对于您的工作流,我认为使用class_double要比直接使用存根Hashes类更好。allow(Hashes)总是要求定义Hashes常量。这就是Ruby的工作原理,而RSpec对此无能为力。使用class double,您可以执行以下操作:

代码语言:javascript
复制
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")为您提供了一个double测试,当定义了Hashes常量时,它将根据Hashes类定义验证模拟的和存根的方法,但是当它没有定义时,它的行为就像一个普通的double,允许在它上面模拟或存根任何东西。as_stubbed_const位告诉rspec-mocks在示例期间将Hashes常量存根,以便对Hashes的任何引用都会得到类double,而不是真正的Hashes类,即使从未定义过Hashes类。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30848877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档