【问题标题】:Python 3 unittest patch doesn't return desired valuePython 3 unittest 补丁未返回所需值
【发布时间】:2019-01-10 22:22:11
【问题描述】:

我正在尝试使用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())

【问题讨论】:

    标签: python python-3.x python-3.4 python-mock


    【解决方案1】:

    这一行

    from libs.util import patch_this_method
    

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

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

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

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

    但你可以简单地写:

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

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

    【讨论】:

    • 第二种方法需要什么补丁?我的意思是patch_this_method,因为我的函数中的其他模块调用了这个方法,我想修补它被调用的任何地方。
    猜你喜欢
    • 2015-06-19
    • 2020-11-26
    • 2019-01-09
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多