2015-06-08 2 views
1

Я хочу создать метод макета, который вызывает метод, из которого вы издеваетесь.Как вызвать метод mocked в Python mock

Я что-то вроде следующего воображая, но я не могу найти никакой документации о макете объект, содержащий ссылку на объект дразнят, который я назвал, как [[wrapped_method_foo]] ниже:

from mock import patch 

class Foo(object): 
    def __init__(self, state): 
     self.state = state 
    def foo(self, a): 
     print "real foo", a 
     return a + self.state 

f = Foo(2000) 
f.foo(1) 

with patch.object(Foo, 'foo', autospec=True) as mock_foo: 
    def side_effect(self, a): 
     print "mock foo", a 
     return mock_foo.[[wrapped_method_foo]](self, a*2) 
    mock_foo.side_effect = side_effect 

    f.foo(2) 

ответ

1

Самый простой способ - захватить свою собственную ссылку на исходную функцию перед исправлением. Заплат может быть сделано в индивидуальном экземпляре класса:

original_foo = f.foo 
with patch.object(f, 'foo') as mock_foo: 
    def side_effect(a): 
     print "mock foo", a 
     return original_foo(a*2) 
    mock_foo.side_effect = side_effect 

    f.foo(2) 

... или латание несвязанного метода на классе:

original_foo = Foo.foo 
with patch.object(Foo, 'foo', autospec=True) as mock_foo: 
    def side_effect(self, a): 
     print "mock foo", a 
     return original_foo(self, a*2) 
    mock_foo.side_effect = side_effect 

    f.foo(3) 
+0

Спасибо Эрин. Мне пришлось немного изменить, чтобы заставить его работать. Но я начинаю сомневаться в том, является ли мое первоначальное намерение использовать макетный объект таким образом, это хорошая идея. – cbare

Смежные вопросы