如果 Minitest 有存根和 Mocks,为什么还要使用 mocha gem?

Zia*_*mar 5 mocking stub minitest

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

小智 1

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

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

将其翻译为 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
Run Code Online (Sandbox Code Playgroud)

为了引入变化,图书馆还希望更新其作者列表。测试会出现错误。不是失败。

我喜欢这个,因为它暗示我在这里做了一些邪恶的事情。

我应该通过提取两个方法“add_new_title”和“add_new_author”来引入另一个间接级别。这样,这个测试逻辑将测试“add_new_title”函数,我们可以轻松地删除“add_new_author”函数。我相信这是“add_book”函数更好的设计。

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