【问题标题】:Why use mocha gem if Minitest have stub and Mocks?如果 Minitest 有 stub 和 Mocks,为什么要使用 mocha gem?
【发布时间】:2017-04-27 09:51:32
【问题描述】:

我看到 Minitest 提供了 Mock 和 stubbing。那么为什么有人使用 mocha gem 来模拟和存根呢? Minitest 存根和模拟是否有限制。如果是,那么有人可以解释一下。

【问题讨论】:

    标签: mocking minitest stub


    【解决方案1】:

    我有同样的问题,正在寻找答案。 Roy Osherove 所著的“单元测试的艺术”一书可以提供帮助。我正在阅读它并发现了一些见解。

    我会推荐它作为评估框架的参考。 Mocha 是一个隔离框架。因此,例如,Roy 指出一个良好的隔离框架可以提供“面向未来”的功能。所以它应该提供“递归伪造”。

    将其转换为 Rspec,它是“as_null_object”,而在 Mocha 中,它是“stub_everything”。 Minitest 存根没有此功能。

    问题是,您是否容忍因间接生产代码更改而导致的测试失败?我愿意。因此,与其让测试默默地通过,我更喜欢看到他们失败并尖叫着要求另一层间接。

    让我举例说明。

    require 'minitest/autorun'
    
    class LibraryTest < Minitest::Test
      def test_update_publisher__add_a_book__library_titles_include_the_new_title
        new_title = "the art of unit testing"
        library = Library.new
    
        Book.stub(:newest_book, {title: new_title}) do
          library.add_book Book.newest_book
        end
    
        assert_includes library.titles, new_title
      end
    end
    
    class Library
      attr_reader :titles, :authors
      def initialize
        @titles = []
        @authors = []
      end
    
      def add_book book
        titles << book[:title]
        # authors << book[:author][:first_name]
      end
    end
    
    class Book
      def self.newest_book
      end
    end
    

    引入更改后,该库还希望更新其作者列表。测试会出错。不是失败。

    我喜欢这个,因为它暗示我在这里做坏事。

    我应该通过提取 2 个方法“add_new_title”和“add_new_author”来引入另一个间接级别。有了这个,这个测试逻辑将测试'add_new_title'函数,我们可以很容易地存根'add_new_author'函数。我相信这是'add_book'函数的更好设计。

    我不应该通过在 latest_book 存根中添加更多作者信息来修复测试,这与当前测试无关。

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      相关资源
      最近更新 更多