我正在做一些集成测试,我想知道如何获取一些内部函数的返回值,我想过要使用模拟,但是那里只有参数
例:
def foo():
goo()
def goo():
return 3
def test():
with patch(goo) as goo_mock:
foo()
assert goo_mock.return_value == 3
最佳答案
这是在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秒钟来计算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
返回的各种值测试goo