2014-01-06 4 views
5

Ich verwende das Python-Mock-Modul für Tests. Ich möchte interne Methodenaufrufe ausspionieren, die von einem Live-Objekt ausgeführt werden. Ich entdeckte, dass die kwarg kann ‚Wraps‘ verwendet werden, um ein Mock einrichten, die auf Verfahren spioniert ruft zu einem Live-Objekt:Verwenden von Python Mock-Bibliothek zum Ausspionieren interner Methodenaufrufe

Using Python mock to spy on calls to an existing object

aber das funktioniert nicht für interne Anrufe. Ich möchte das verwenden, um zu testen, dass eine Methode auf höherer Ebene Methoden der niedrigeren Ebene in der richtigen Reihenfolge aufruft.

Gegeben:

class ClassUnderTest(object): 
    def lower_1(self): 
     print 'lower_1' 

    def lower_2(self): 
     print 'lower_2' 

    def higher(self): 
     self.lower_1() 
     self.lower_2() 

ich mag es testen können als

import mock 

DUT = ClassUnderTest() 
mock_DUT = mock.Mock(wraps=DUT) 
# test call 
mock_DUT.higher() 

# Assert that lower_1 was called before lower_2 
assert mock_DUT.mock_calls[1:] = [mock.call.lower_1(), mock.call.lower_2()] 

Dies funktioniert nicht, da die ‚Selbst‘ Parameter höher() sind auf den ursprünglichen DUT gebunden Objekt, und nicht der Mock_DUT Spion. Daher wird nur der anfängliche Aufruf von high() in mock_calls protokolliert. Gibt es eine bequeme Möglichkeit, diese Art von Assertion mit dem Python-Mock-Modul durchzuführen?

Antwort

6

Das ist so ähnlich wie mit einem Mockito Spion in Java. http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html

Sie können einen „Spion“ mit dem Mock (spez = obj) Konstruktor konstruieren, die die __class__ zu ClassUnderTest gleich Attribute machen, wo der Mock (Wraps = obj) Konstruktor nicht. Da in Python-Klassenmethoden die a-Klasseninstanz, der self-Parameter, als ihr erster Parameter verwendet wird, können Sie sie mit einem Mock aufrufen, als ob es eine statische Methode für die Klasse wäre.

import mock 

DUT = ClassUnderTest() 
spy = mock.Mock(spec=DUT) 
# test call 
ClassUnderTest.higher(spy) 

# Assert that lower_1 was called before lower_2 
assert spy.mock_calls == [mock.call.lower_1(), mock.call.lower_2()] 
Verwandte Themen