是否需要在 minitest 中验证模拟

Does verifying the mock is need in 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 呢?

你是对的,你不能为配置的模拟设置任何其他东西,但如果你的模拟根本没有被调用,那么你可以用 mock.verify 找出来。因此,如果您的被测方法应该调用模拟方法,您应该验证它是否被调用了。

你是对的,mock.expect(:use_any_string, true, [String]) 如果没有在 mock 上进行预期的调用,将导致测试失败。

然而,使用 mock.verify 取决于您如何编写测试。在您的示例中,您显式调用了使用 mock.use_any_string("foo") 测试的方法,因此无需同时调用 mock.verify.

您可能会遇到这样一种情况,您没有明确地进行此调用,或者期望模拟在特定时间进行了调用。这些场景将利用 mock.verify 个调用。

(另外注意,最近minitest推出了assert_mock可以用来代替mock.verify)