【问题标题】:How do I use MiniTest::Mock to assert that a 'verify' method has been called on a mocked object?如何使用 MiniTest::Mock 断言已在模拟对象上调用了“验证”方法?
【发布时间】:2017-03-01 09:05:45
【问题描述】:

我有一个类定义了一个“验证”方法,不幸的是,它与 MiniTest::Mock 用于验证方法已被调用的名称相同。我遇到了一个严重的问题。

我有如下定义的类。

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

我该如何解决这个问题?

【问题讨论】:

    标签: ruby unit-testing mocking minitest


    【解决方案1】:

    编辑:原始帖子(底部)不正确。

    一个可行的解决方案是:

    @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 来捕获范围),然后在模拟上取消定义“验证”。

    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
    

    【讨论】:

    • 因为assert返回一个proc,你需要真正call那个proc,最后一行应该是@mock_verifier.assert.call
    • 好收获。谢谢。是假绿色。我的 TDD 实践不佳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多