我怎样才能窥探内部函数返回值

时间:2018-05-14 05:30:46

标签: python testing mocking

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

示例:

def foo():
    goo()

def goo():
    return 3

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

1 个答案:

答案 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时,您传递了正确的答案数据。

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