python 模拟函数未调用

问题描述 投票:0回答:3

我正在测试python代码(一个django 3.0.5项目,尽管我认为它不相关),但我无法调用我的模拟对象的函数。这是我的代码:

**myproject.mypackage.myhelpers**


def get_dict():
    return dict()

**myproject.mypackage.mythings**

from .myhelpers import get_dict


def use_dict():
    the_dict = get_dict()
    pass
    return


**myproject.tests.test_mythings**

from ..mypackage import mythings
import unittest
import unittest.mock as mock


class MyThingsTests(unittest.TestCase):

    @mock.patch('myproject.mypackage.myhelpers')
    def test_using_dict(self, mock_myhelpers):
        test_dict = {
            "hi": "foo",
            "there": "bar",
            "sir": "foobar"
        }

        mock_myhelpers.get_dict.return_value = test_dict

        mythings.use_dict()

        mock_myhelpers.get_dict.assert_called_once()

然而最终测试失败并出现错误:

AssertionError: Expected 'get_dict' to have been called once. Called 0 times

python mocking python-unittest python-unittest.mock
3个回答
17
投票

试试这个:

@mock.patch('myproject.mypackage.mythings.get_dict')
def test_using_dict(self, mock_get_dict):
    test_dict = {
        "hi": "foo",
        "there": "bar",
        "sir": "foobar"
    }

    mock_get_dict.return_value = test_dict

文档的在哪里修补部分对此进行了一些解释。

根据我的理解,

myproject.mypackage.mythings
在进行补丁之前已经导入了“真实”
get_dict
。因此,如果您像
@mock.patch('myproject.mypackage.myhelpers')
那样对其进行修补,则只有
myhelpers
模块会“知道”它已被修补。
mythings
模块仍将引用真实的
get_dict

我认为上述修补方式的替代方法是更改导入方式

get_dict
。不要直接导入
get_dict
,只需导入
myhelpers
并将
get_dict
用作
myhelpers.get_dict
。然后你应该能够保持你的修补方式相同,因为
get_dict
将从具有修补方法的
myhelpers
中查找。


1
投票

解决方案1

  • myproject.mypackage.myhelpers
    替换为
    myproject.mypackage.mythings
# @mock.patch('myproject.mypackage.myhelpers')
@mock.patch('myproject.mypackage.mythings.get_dict')
def test_using_dict(self, mock_get_dict):
    test_dict = {
        "hi": "foo",
        "there": "bar",
        "sir": "foobar"
    }

    mock_get_dict.return_value = test_dict

解决方案2

  • from .myhelpers import get_dict
    替换为
    import .myhelpers as helpers
**myproject.mypackage.mythings**

# from .myhelpers import get_dict
import .myhelpers as helpers

def use_dict():
    the_dict = helpers.get_dict()
    pass
    return

总结

  • 解决方案 1 更好,因为它不会打扰您更新所有
    import
    文件中的
    .py
    样式

0
投票

在补丁调用的位置定义补丁

✅
myproject.mypackage.mythings

不在补丁定义的位置

❌ myproject.mypackage.myhelpers
    
© www.soinside.com 2019 - 2024. All rights reserved.