如何使用MiniTest :: Mock断言已在模拟对象上调用'verify'方法?

时间:2016-10-19 15:50:37

标签: ruby unit-testing mocking minitest

我有一个定义'verify'方法的类,遗憾的是,它与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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

一个有效的解决方案是:

@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方法(需要使用 - &gt; 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