2016-05-31 15 views
0

Ich habe erfolgreich eine Eigenschaft mit PropertyMock verspottet, aber ich kann nicht herausfinden, wie überprüft werden kann, welche Instanz der Klasse diese Eigenschaft aufgerufen hat. Wie kann ich behaupten, dass die Eigenschaft an einem Objekt aufgerufen wurde, aber nicht an einem anderen?Stellen Sie sicher, dass ein PropertyMock für eine bestimmte Instanz aufgerufen wurde

Hier ist ein Beispiel, wo ich behaupten möchte, dass foo1.is_big genannt wurde, und foo2.is_big war nicht:

from mock import PropertyMock, patch 


class Foo(object): 
    def __init__(self, size): 
     self.size = size 

    @property 
    def is_big(self): 
     return self.size > 5 

f = Foo(3) 
g = Foo(10) 
assert not f.is_big 
assert g.is_big 

with patch('__main__.Foo.is_big', new_callable=PropertyMock) as mock_is_big: 
    mock_is_big.return_value = True 
    foo1 = Foo(4) 
    foo2 = Foo(9) 

    should_pass = False 
    if should_pass: 
     is_big = foo1.is_big 
    else: 
     is_big = foo2.is_big 
    assert is_big 
    # How can I make this pass when should_pass is True, and fail otherwise? 
    mock_is_big.assert_called_once_with() 

print('Done.') 

Der aktuelle Code wird passieren, wenn einer von ihnen genannt wird.

+0

Ich glaube nicht, dass Sie können; Eigenschaften werden an der * Klasse * aufgerufen, nicht an der * Instanz *. – jonrsharpe

Antwort

0

Vielleicht gibt es einen besseren Weg, aber ich habe es geschafft, indem ich eine Unterklasse von PropertyMock erstellt habe, die die Instanz aufzeichnet, in der sie als einer der Parameter für den Scheinaufruf aufgerufen wurde.

from mock import PropertyMock, patch 


class Foo(object): 
    def __init__(self, size): 
     self.size = size 

    @property 
    def is_big(self): 
     return self.size > 5 


class PropertyInstanceMock(PropertyMock): 
    """ Like PropertyMock, but records the instance that was called. 
    """ 
    def __get__(self, obj, obj_type): 
     return self(obj) 

    def __set__(self, obj, val): 
     self(obj, val) 

with patch('__main__.Foo.is_big', new_callable=PropertyInstanceMock) as mock_is_big: 
    mock_is_big.return_value = True 
    foo1 = Foo(4) 
    foo2 = Foo(9) 

    should_pass = False 
    if should_pass: 
     is_big = foo1.is_big 
    else: 
     is_big = foo2.is_big 
    assert is_big 
    # Now this passes when should_pass is True, and fails otherwise. 
    mock_is_big.assert_called_once_with(foo1) 

print('Done.') 
Verwandte Themen