2016-10-19 7 views
0

У меня есть класс, который определяет метод проверки, который, к сожалению, имеет то же имя, которое MiniTest :: Mock использует для проверки метода. Я сталкиваюсь с проблемой скремблирования.Как использовать 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 

Как обойти это?

ответ

0

EDIT: Исходное сообщение (внизу) было неверным.

Рабочий раствор:

@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 # проверить метод под другим именем методы (- > 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 
+0

Так утверждают возвращает процедурный, вам нужно на самом деле _call_ этого прок, последняя строка должна быть '@ mock_verifier.assert.call' – philomory

+0

Хорошо поймать. Благодарю. Был ложный зеленый цвет. Плохая практика TDD с моей стороны. –