8

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

我试过

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

这给出了错误“哈希不是一个类”。然后我实现了一个类“哈希”

class Hashes
end

然后只尝试以相同的方式存根类方法。当我将该方法添加到我的类定义中时,这会给出错误“哈希未实现:calculate_hash”:

class Hashes
    def self.calculate_hash(filename)
    end
end

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

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

任何帮助是极大的赞赏。

4

1 回答 1

11

对于您的工作流程,我认为使用 aclass_doubleHashes直接存根类要好。 allow(Hashes)总是需要定义Hashes常量。这只是 Ruby 的工作方式,而 RSpec 对此无能为力。使用类 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常量被定义时,它将根据类定义验证模拟和存根方法Hashes,但是当它没有定义时,它将像正常的替身一样允许任何东西被模拟或存根。 . 该as_stubbed_const位告诉 rspec-mocksHashes在示例期间对常量进行存根,这样任何引用Hashes都会使您的类翻倍而不是真正的Hashes类,即使Hashes该类从未定义过。

于 2015-06-15T15:46:21.937 回答