如何在 Python 模拟中调用模拟方法
How to call mocked method in 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)
最简单的方法是在修补之前获取您自己对原始函数的引用。可以在 class:
的单个实例上进行修补
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)
...或通过修补 class:
上的未绑定方法
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)
补丁对象有一个未记录的 temp_original
属性,您可以使用它。
在这种情况下,我通常会这样做:
from __future__ import print_function
import mock
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)
fake_foo = mock.patch.object(Foo, 'foo', autospec=True)
# def side_effect(*args, **kwargs): # generic version
def side_effect(self, a):
print("mock foo", a)
return fake_foo.temp_original(self, a*2)
with fake_foo as mock_foo:
mock_foo.side_effect = side_effect
assert f.foo(2) == 2004
当我只使用模拟来断言在测试期间调用的函数时,我正在使用它
我想创建一个模拟方法来调用被模拟的底层方法。
我在想像下面这样的东西,但我找不到任何关于模拟对象的文档,该模拟对象持有对被模拟对象的引用,我在下面表示为 [[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)
最简单的方法是在修补之前获取您自己对原始函数的引用。可以在 class:
的单个实例上进行修补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)
...或通过修补 class:
上的未绑定方法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)
补丁对象有一个未记录的 temp_original
属性,您可以使用它。
在这种情况下,我通常会这样做:
from __future__ import print_function
import mock
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)
fake_foo = mock.patch.object(Foo, 'foo', autospec=True)
# def side_effect(*args, **kwargs): # generic version
def side_effect(self, a):
print("mock foo", a)
return fake_foo.temp_original(self, a*2)
with fake_foo as mock_foo:
mock_foo.side_effect = side_effect
assert f.foo(2) == 2004
当我只使用模拟来断言在测试期间调用的函数时,我正在使用它