簡體   English   中英

如何使用MiniTest :: Mock斷言已在模擬對象上調用了“驗證”方法?

[英]How do I use MiniTest::Mock to assert that a 'verify' method has been called on a mocked object?

我有一個定義“驗證”方法的類,不幸的是,該方法與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

我該如何解決?

編輯:原始帖子(在底部)不正確。

一個有效的解決方案是:

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM