在minitest中是否需要验证模拟

时间:2019-01-07 10:18:12

标签: minitest

我正在阅读minitest的模拟功能。

require "minitest/autorun"

mock = MiniTest::Mock.new
mock.expect(:use_any_string, true, [String])
mock.use_any_string("foo")
## mock.use_any_string(1)
## MockExpectationError: mocked method :use_any_string called with unexpected arguments [1]


## I do not understand the purpose for this 
mock.verify

所以我不明白使用mock.verify的目的,因为尝试将非String的任何其他类型(传递给use_any_string)都会导致模拟期望错误。

那么为什么要使用assert mock.verify

2 个答案:

答案 0 :(得分:1)

您是对的,您无法为配置的模拟设置任何其他设置,但是如果根本没有调用模拟,则可以使用mock.verify进行查找。因此,如果您要测试的方法应该调用模拟方法,则应该验证它是否完全被调用。

答案 1 :(得分:0)

您是正确的,如果未对模拟进行预期的调用,mock.expect(:use_any_string, true, [String])将导致测试失败。

但是,使用mock.verify取决于您的测试方式。在您的示例中,您正在显式调用要使用mock.use_any_string("foo")测试的方法,因此无需同时调用mock.verify。

您可能会遇到一种情况,即您没有明确地进行此调用,或者期望该模拟在特定时间进行了调用。这些方案将利用模拟调用验证。

(另一点说明,minitest最近引入了assert_mock,可以用来代替mock.verify)