我正在做一些集成测试,我想知道如何获得一些内部函数的返回值,我想过使用模拟,但是只有那里有参数
示例:
def foo():
goo()
def goo():
return 3
def test():
with patch(goo) as goo_mock:
foo()
assert goo_mock.return_value == 3
答案 0 :(得分:1)
这是一个在Windows上的python 2.7.10和3.6.1中有效的答案
import sys
if sys.version_info[0] < 3:
from mock import patch
else:
from unittest.mock import patch
def foo():
return goo()
def goo():
return 3
class CaptureValues(object):
def __init__(self, func):
self.func = func
self.return_values = []
def __call__(self, *args, **kwargs):
answer = self.func(*args, **kwargs)
self.return_values.append(answer)
return answer
def test():
with patch('__main__.goo', CaptureValues(goo)) as goo_mock:
x = foo()
x = foo()
print(goo_mock.return_values)
assert goo_mock.return_values == [3, 3]
if __name__ == '__main__':
test()
return_value
用于当您希望函数返回某个任意值时,以便您可以测试其他部分。这是goo
,需要很长时间才能计算出来。我已经在其他地方对goo
进行了测试,我确实正在测试foo
的内部结构,我不想等待5秒钟来计算真正的答案{ {1}}返回。 (看看差异,取消注释goo
并观看激动人心的倒计时)
slow_test
通常,您希望使用模拟从帮助程序import time
from unittest.mock import patch
def foo(x):
return goo(x)
def goo(x):
for sec in range(x, 0, -1):
time.sleep(1)
print(sec)
return x**2
def slow_test():
x = foo(5)
assert x == 25
def test():
with patch('__main__.goo') as goo_mock:
goo_mock.return_value = 25
x = foo('who cares')
assert x == 25
if __name__ == '__main__':
test()
# slow_test()
创建假答案。这是为了确保goo
按照foo
的具体答案按预期工作和/或测试当您将数据转换为goo
时,您传递了正确的答案数据。
goo
goo
:
foo
确保您传递了mock_goo.assert_called_with()
正确的值goo
设置为使用mock_goo.return_value
foo