如何监视内部函数返回值

2024-04-26 23:44:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一些集成测试,我想知道如何获得一些内部函数的返回值,我曾考虑过使用mocks,但那里只有get参数

示例:

def foo():
    goo()

def goo():
    return 3

def test():
    with patch(goo) as goo_mock:
        foo()
        assert goo_mock.return_value == 3

Tags: 函数test示例参数getreturnfoodef
1条回答
网友
1楼 · 发布于 2024-04-26 23:44:39

下面是一个在windows上运行的Python2.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并观看激动人心的倒计时)

^{pr2}$

通常,您希望使用mock从助手goo创建一个假答案。这是为了确保foo与来自goo的特定答案一起按预期工作,和/或测试在将数据转换为goo时,是否传递了正确的数据。在

  1. 测试goo
  2. 测试foo
    1. 使用mock_goo.assert_called_with()确保传递了goo正确的值
    2. mock_goo.return_value设置为使用从goo返回的各种值测试foo

相关问题 更多 >