我正在使用rspec-mock进行测试驱动的开发。
我开始实现单个类,并使用rspec-mock模拟/ stub 其他类。
模拟尚未实现的类的对象效果很好。
但是,当我尝试模拟尚不存在的类的类方法时,我没有成功。
我的类“哈希”应具有一个类方法“calculate_hashes”,该方法接收文件名并返回哈希。
我试过了
allow(Hashes).to receive(:calculate_hash) do |file|
# looks up what to return
end
出现错误“哈希不是类”。
然后,我实现了一个“哈希”类
class Hashes
end
然后仅尝试以相同方式对类方法进行 stub 。
这给出了错误“哈希未实现: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")
为您提供了一个测试 double 型,当定义了Hashes
常量时,它将针对Hashes
类定义验证已模拟和 stub 的方法,但是当未定义时,其作用类似于允许对任何事物进行模拟或模拟的普通 double 型。 s在上面。 as_stubbed_const
位告诉rspec-mocks在示例过程中对Hashes
常量进行 stub 处理,以便对Hashes
的任何引用都使您的类加倍,而不是真正的Hashes
类,即使从未定义Hashes
类也是如此。