如何模拟在类方法中使用的外部函数?

时间:2019-07-06 13:34:50

标签: python mocking pytest

我想模拟某个方法中使用的函数。此功能位于其他模块中。

我该怎么做?

尝试了此选项,但是它不起作用。

SomeClass().foo()

我希望mock_return()my_function()内部执行我的whereJsonContains()

1 个答案:

答案 0 :(得分:1)

您可以将unittest.mock.patchpytest-mock插件与mocker固定装置一起使用。

您的包裹

pack/another_pack.py

from pack import utils

class SomeClass:
    def foo(self):
        return utils.my_function()

pack/utils.py

def my_function():
    return 'original'

测试

import pytest
from unittest.mock import patch
from pack.another_pack import SomeClass


# Replace my_function with another function. You could pass parameters
# to the mocked function and handle them in the replacement.
@pytest.mark.parametrize("attr", ["a", "b", "c"])
def test_replace(attr):
    def mock_return():
        return attr

    with patch("pack.another_pack.utils.my_function", new=mock_return):
        assert SomeClass().foo() == attr


# If you just want to override the return value.
@pytest.mark.parametrize("attr", ["a", "b", "c"])
def test_return_value(attr):
    with patch("pack.another_pack.utils.my_function") as my_func:
        my_func.return_value = attr
        assert SomeClass().foo() == attr


# With the pytest-mock plugin and the mocker fixture instead of unittest.mock.
@pytest.mark.parametrize("attr", ["a", "b", "c"])
def test_mock_plugin(attr, mocker):
    my_func = mocker.patch("pack.another_pack.utils.my_function")
    my_func.return_value = attr
    assert SomeClass().foo() == attr

请注意,在所有测试中,patch的第一个参数是要在其中模拟函数(pack.another_pack)的模块的名称,以及函数名称在模块中的显示方式( utils.my_function

my_function是针对整个pack.another_pack模块的模拟。