python - 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())
解决方案
这条线
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)
现在您的函数将使用模拟函数。
推荐阅读
- java - 我如何告诉 Joda Time 我给它的时间是针对特定时区偏移量的,即使字符串中没有给出偏移量?
- c# - 奇怪的 C# 行为
- python - 如何使 DRF Serializer create() 函数仅创建一个尚不存在的条目?
- go - go 例程运行时如何从通道读取
- django - django.db.utils.OperationalError: FATAL: database does not exist (postgres / deploy to digitalocean)
- javascript - 使用jQuery的每个函数来计算具有相同类的div
- javascript - 从命令行运行时量角器示例测试失败。无法读取 unfined 的属性“$$testability”
- java - Spring Boot:可能已弃用 SpringBootServletInitializer
- python - 熊猫排序值数字负数和正数
- html - Shopify Liquid Filter 直接在 HTML 中插入 SVG 文件?