无法在Python中模拟函数(Django)

时间:2018-02-08 10:17:16

标签: python django python-3.x unit-testing

我试图模拟在我测试的函数中使用的函数,但由于某种原因我没有看到原始函数总是运行,而不是我创建的模拟函数。

我测试的代码有这种类型的设置:

def function_being_tested(foo):
    ...
    function_i_want_to_mock(bar)
    ...

def function_i_want_to_mock(bar)
    print("Inside original function")
    ...

我已经安装了Mock,我尝试过使用unittest.mock补丁

目前,测试文件使用此设置:

import mock
from django.test import TestCase


def mock_function_i_want_to_mock(bar):
    print(bar)
    return True


class SupportFunctionsTestCases(TestCase):

    @mock.patch("path.to.function.function_i_want_to_mock", mock_function_i_want_to_mock)
    def test_function_being_tested(self):
        # setup
        result = function_being_tested(test_foo)
        self.assertEqual(result, expected_result)

当我运行测试时,我总是得到:"在原始功能"内部,而不是打印参数,因此它始终运行原始功能。

之前我已经使用了这个确切的设置并且它已经工作了所以我不确定导致这种情况的原因。可能是一些错误的设置...

如果有人采用不同的方式做到这一点或发现一些错误,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

"path.to.function.function_i_want_to_mock"应该是使用函数的路径,而不是定义。

因此,如果在function_i_want_to_mock中定义moduleA.py但在您正在测试的moduleB.py中导入并使用@mock.patch("path.to.moduleB.function_i_want_to_mock", ...),则应使用{{1}}。