我正在使用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类也是如此。

10-07 12:39