首页 > 解决方案 > Python 3 unittest 补丁未返回所需值

问题描述

我正在尝试使用unitttest mock框架(python 3.4.9)来模拟我的测试用例中的一种方法。它失败了,因为它没有返回模拟值。

这是最简单的例子。就我而言,我无法更改调用方法的方式。

模拟方法

def patch_this_method():
    return 100

测试用例

import unittest
from unittest.mock import patch
from libs.util import patch_this_method
import libs

class TestLibs(unittest.TestCase):
    @patch('libs.util.patch_this_method', return_value="200")
    def test_1(self, *mock):
        # return 200
        print(libs.util.patch_this_method())

        # this returns 100, original value
        print(patch_this_method())

标签: pythonpython-3.xpython-3.4python-mock

解决方案


这条线

from libs.util import patch_this_method

导入一个作为原始函数副本的对象,该函数尚未修补。

然后参数前多了一个奇怪的*char mock;它实际上不会影响代码,因为它没有被使用,然后您获得了预期的结果。第一个调用链接到修补函数。另一个没有。

编辑:关于你在评论中的问题,你不能不使用补丁装饰器,使用不包含在某些包中的简单名称是行不通的。从补丁装饰器的文档中(目标是要补丁的字符串):

目标应该是格式为“package.module.ClassName”的字符串。导入目标并将指定对象替换为新对象,因此目标必须可以从您调用 patch() 的环境中导入。目标是在执行装饰函数时导入的,而不是在装饰时。

但你可以简单地写:

from unittest.mock import Mock # or MagickMock if you need it
...
patch_this_method = Mock(return_value=200) 

现在您的函数将使用模拟函数。


推荐阅读