【问题标题】:patching a function if that function is imported using the from statement如果该函数是使用 from 语句导入的,则修补该函数
【发布时间】:2022-01-07 23:23:15
【问题描述】:

我有一个类似于以下代码的情况,我试图修补使用 from 语句导入的函数:

from module1 import function1

def function2():
    function1_result = function1()
    return 2*function1_result

然后测试代码是:

from unittest import patch
def test_function2():
    func1_value = 5
    with patch("module1.function1", return_value=func1_value) as patched_func1:
        function2_value = function2()
    assert function2_value==2*func1_value

但是代码运行但它不使用修补函数 1 并实际调用该函数。但是,如果我将 import 语句更改为 import module1,那么测试运行良好。

【问题讨论】:

  • 您应该修补module2.function1,其中module2 是function2 所在的位置以及您已将function1 导入的位置,如在导入后从该模块访问测试代码function1 的上下文中.
  • 我认为这不是问题,因为当我将导入更改为 import module1 时,测试运行良好。 (我已经修改了问题)
  • 它会运行良好,因为在您更改之后,在测试代码中,要修补的函数是module1.function1,请考虑function1 在您的代码中的位置,以及补丁是什么替换呼叫。在失败的情况下,您将 function` 带入 module2 命名空间。所以修补需要替换对module2.function1 的调用。在后一种情况下 module1 被导入并且 function1 仍然被称为 module1.function1 所以补丁工作正常
  • 啊,是的,我和你在一起。谢谢!

标签: python unit-testing mocking python-unittest


【解决方案1】:

Where to patchdoc,文档中的例子很清楚。

module1.py:

def function1():
    return 1

module2.py:

from module1 import function1


def function2():
    function1_result = function1()
    return 2*function1_result

test_module2.py:

from unittest import TestCase
from unittest.mock import patch
import unittest
from module2 import function2


class TestModule2(TestCase):
    def test_function2(self):
        func1_value = 5
        with patch("module2.function1", return_value=func1_value) as patched_func1:
            function2_value = function2()
        assert function2_value == 2*func1_value


if __name__ == '__main__':
    unittest.main()

测试结果:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多