[英]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)
最簡單的方法是在修補之前獲取對原始功能的引用。 可以對類的單個實例進行修補:
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)
修補程序對象具有可以使用的未記錄的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
當我僅使用模擬來斷言在測試期間調用的函數時,我正在使用此函數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.