我正在做一些集成测试,我想知道如何获取一些内部函数的返回值,我想过要使用模拟,但是那里只有参数

例:

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

10-08 20:01