【发布时间】:2017-04-27 09:51:32
【问题描述】:
我看到 Minitest 提供了 Mock 和 stubbing。那么为什么有人使用 mocha gem 来模拟和存根呢? Minitest 存根和模拟是否有限制。如果是,那么有人可以解释一下。
【问题讨论】:
我看到 Minitest 提供了 Mock 和 stubbing。那么为什么有人使用 mocha gem 来模拟和存根呢? Minitest 存根和模拟是否有限制。如果是,那么有人可以解释一下。
【问题讨论】:
我有同样的问题,正在寻找答案。 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 存根中添加更多作者信息来修复测试,这与当前测试无关。
【讨论】: