繁体   English   中英

我如何监视内部函数的返回值

[英]How can I spy an inner function return value

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

例:

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创建虚假答案。 这是为了确保foogoo特定答案下可以正常工作,并且/或者测试将数据转换为goo时是否传递了正确的数据。

  1. 测试goo
  2. 测试foo
    1. mock_goo.assert_called_with()确保你通过goo正确的价值观
    2. 设置mock_goo.return_value以使用从goo返回的各种值来测试foo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM