我正在使用rspec-mock进行测试驱动开发。我开始实现单个类,并使用rspec-mock模拟/存根其他类。模拟尚未实现的类的对象效果很好。然而,当我试图模拟一个还不存在的类的类方法时,我并没有成功。我的类“hash”应该有一个类方法"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然后只尝试以相同的方式来存根类方法。当我将这个方法添加到我的类定义中时,这会给出错误"Hashes not implement: calculate_hash“:
class Hashes
def self.calculate_hash(filename)
end
end它终于起作用了,我的这个类方法的存根使用"allow(Hashes)“起作用,如上面的例子所示。我只是想知道是否有一种方法可以在不编写这个类框架的情况下实现这一点。
或者我可能试图以一种不适当的方式完成某件事?或者rspec-mock可能不是做这件事的正确工具?
任何帮助都是非常感谢的。
发布于 2015-06-15 23:46:22
对于您的工作流,我认为使用class_double要比直接使用存根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
endclass_double("Hashes")为您提供了一个double测试,当定义了Hashes常量时,它将根据Hashes类定义验证模拟的和存根的方法,但是当它没有定义时,它的行为就像一个普通的double,允许在它上面模拟或存根任何东西。as_stubbed_const位告诉rspec-mocks在示例期间将Hashes常量存根,以便对Hashes的任何引用都会得到类double,而不是真正的Hashes类,即使从未定义过Hashes类。
https://stackoverflow.com/questions/30848877
复制相似问题