如何使用 MiniTest::Mock 断言已在模拟对象上调用了 'verify' 方法?
How do I use MiniTest::Mock to assert that a 'verify' method has been called on a mocked object?
我有一个 class,它定义了一个 'verify' 方法,不幸的是,该方法与 MiniTest::Mock 用来验证已调用方法的名称相同。我 运行 陷入了一个破坏性的问题。
我有 class 定义如下。
class Reader
def initialize(verifier)
@verifier = verifier
end
def verify(subject)
@verifier.verify(subject)
end
end
class Verifier
def verify(subject)
subject != nil
end
end
我有如下测试设置。
class TestReader < MiniTest::Test
def test_reader_when_verification_fails
mock_verifier = MiniTest::Mock.new
mock_verifier.expect :verify, false
reader = Reader.new(mock_verifier)
reader.verify(nil)
# The following verify method ends up being the 'verify' defined on
# Verifier, not on MiniTest::Mock. It blows up because Verifier#verify
# expects an argument.
mock_verifier.verify
end
end
我该如何解决这个问题?
编辑:原始 post(底部)不正确。
可行的解决方案是:
@mock_verifier.instance_eval {
def assert
@expected_calls.each do |name, expected|
actual = @actual_calls.fetch(name, nil)
raise MockExpectationError, "expected #{__call name, expected[0]}" unless actual
raise MockExpectationError, "expected #{__call name, expected[actual.size]}, got [#{__call name, actual}]" if
actual.size < expected.size
end
true
end
}
* 以下是错误的 *
打开模拟,将 MiniTest::Mock#verify 方法保存在不同的方法名称下(需要 -> Proc 来捕获范围),然后在模拟上取消定义 'verify' .
def @mock_verifier.assert
-> { @mock_verifier.method(:verify) }
end
@mock_verifier.instance_eval 'undef :verify'
最后你做
@mock_verifier.expect :verify, false
@reader.verify(nil)
@mock_verifier.assert
我有一个 class,它定义了一个 'verify' 方法,不幸的是,该方法与 MiniTest::Mock 用来验证已调用方法的名称相同。我 运行 陷入了一个破坏性的问题。
我有 class 定义如下。
class Reader
def initialize(verifier)
@verifier = verifier
end
def verify(subject)
@verifier.verify(subject)
end
end
class Verifier
def verify(subject)
subject != nil
end
end
我有如下测试设置。
class TestReader < MiniTest::Test
def test_reader_when_verification_fails
mock_verifier = MiniTest::Mock.new
mock_verifier.expect :verify, false
reader = Reader.new(mock_verifier)
reader.verify(nil)
# The following verify method ends up being the 'verify' defined on
# Verifier, not on MiniTest::Mock. It blows up because Verifier#verify
# expects an argument.
mock_verifier.verify
end
end
我该如何解决这个问题?
编辑:原始 post(底部)不正确。
可行的解决方案是:
@mock_verifier.instance_eval {
def assert
@expected_calls.each do |name, expected|
actual = @actual_calls.fetch(name, nil)
raise MockExpectationError, "expected #{__call name, expected[0]}" unless actual
raise MockExpectationError, "expected #{__call name, expected[actual.size]}, got [#{__call name, actual}]" if
actual.size < expected.size
end
true
end
}
* 以下是错误的 *
打开模拟,将 MiniTest::Mock#verify 方法保存在不同的方法名称下(需要 -> Proc 来捕获范围),然后在模拟上取消定义 'verify' .
def @mock_verifier.assert
-> { @mock_verifier.method(:verify) }
end
@mock_verifier.instance_eval 'undef :verify'
最后你做
@mock_verifier.expect :verify, false
@reader.verify(nil)
@mock_verifier.assert