gpt4 book ai didi

Python:在测试函数的同一模块中定义的修补函数

转载 作者:太空狗 更新时间:2023-10-30 00:18:46 25 4
gpt4 key购买 nike

我一直在使用 Python 的 unittest.mock 库,但现在我正在努力处理一个可能无法正确处理的用例。

考虑一个包含以下片段的文件 mymodule/code.py:

def sum():
pass

def mul():
pass

def div():
pass

def get_functions():
return [sum, mul, div]

def foo():
functions = get_functions()
for func in functions:
func()

我想测试 foo 函数,修补 sum 函数,并将 muldiv 保留为他们是。这是我最初尝试的:

class TestFoo(unittest.TestCase):
@mock.patch('mymodule.code.foo.sum')
def test_foo(foo_sum_mock):
foo()
foo_sum_mock.assert_called_once()

但是,上面说明的修补方法不起作用。我相信 sum 函数在加载 mymodule.code.py 时已正确修补,但由于 def sum() block 而重新定义。

通过阅读官方文档,我也尝试使用unittest.mock库的startstop函数如下:

def test_foo():
patcher = mock.patch('module.code.sum')
mocked_sum_fun = patcher.start()

foo()

mocked_sum_fun.assert_called_once()
mock_sum_fun.stop()

这种方法也行不通。我希望它能避免在 modules/code.py 文件加载后重写 sum 函数。

是否可以修补一个局部函数,例如sum?或者将 sum 函数移动到另一个文件是修补的唯一选择?

非常感谢!

最佳答案

您可以使用 mock.patch 模拟同一模块的函数并将此模块引用为 __main__

代码.py

from unittest.mock import patch

def sum():
print("called method sum")
pass

def call_sum():
sum()

def return_mock():
print("I'm a mocked method")
return True

with patch('__main__.sum', return_value=return_mock()) as mock_test:
call_sum()
mock_test.assert_called_once() # assure that mocked method was called, not original.

您也可以使用库的路径 (my_project.code.sum) 而不是 __main__.sum

关于Python:在测试函数的同一模块中定义的修补函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com