【问题标题】:How to stub a class method using rspec/rspec-mocks如何使用 rspec/rspec-mocks 存根类方法
【发布时间】:2015-08-31 04:01:21
【问题描述】:

我正在使用 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 可能不是执行此操作的正确工具?

非常感谢任何帮助。

【问题讨论】:

    标签: ruby rspec mocking rspec-mocks


    【解决方案1】:

    对于您的工作流程,我认为使用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
    end
    

    class_double("Hashes") 为您提供了一个测试替身,当Hashes 常量被定义时,它将根据Hashes 类定义验证模拟和存根方法,但是当它没有定义时,它将像一个允许任何东西在其上被嘲笑或存根的普通双精度。 as_stubbed_const 位告诉 rspec-mocks 在示例期间存根 Hashes 常量,以便对 Hashes 的任何引用都使您的类加倍,而不是真正的 Hashes 类,即使 Hashes 类从未被定义。

    【讨论】:

    • 好的,可以,谢谢!但是,我想知道如何处理需要类方法和实例方法的示例。例如new_book = Book.new\ content = new_book.read_page(5)我是否首先需要使用book_object = double("Book")\ allow(book_object).to receive(:read_page).and_return(...) 模拟对象,然后通过book = class_double("Book")\ allow(book).to receive(:new).and_return(book_object) 模拟类,这是要走的路吗?
    • 由于评论格式,很难阅读您的问题。您可以将您的问题发送到 RSpec 邮件列表吗? groups.google.com/group/rspec
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多