python - 如何在python unittest中永久模拟函数的返回值

标签 python python-3.x mocking patch python-unittest

我有一个函数

# foo.py
NUM_SHARDS = 10
def get_shard(shard_key: int) -> int
    return (shard_key % NUM_SHARDS) + 1

我想模拟这个函数,这样无论何时调用这个函数,它都会返回一个特定的值。我试过这样打补丁

# test.py
@mock.patch('foo.get_shard', return_value=11)
    def testSomething(self, patched_func):
        patched_func() # >> 11 ... OK so this is fine but
        get_shard(4) # >> 5 .... Original impl being executed

我想深入修改此函数以始终返回此值,无论是否直接从单元测试调用此函数。

对于上下文,我有许多生产分片 (10) 和一个测试分片 (11)。 get_shard 函数被多次调用,该函数的生产版本只知道 10 个分片。因此,我希望此函数在单元测试上下文中执行时始终返回 11(测试分片编号)。

最佳答案

mock.patch 方法用于临时模拟给定对象。如果你想永久改变一个函数的返回值,你可以简单地覆盖它,方法是用一个指定了 return_valueMock 对象赋值给它:

import foo
from unittest.mock import Mock
foo.get_shard = Mock(return_value=11)

关于python - 如何在python unittest中永久模拟函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56139563/

相关文章:

get_attribute 函数的 Python Selenium 编码问题

unit-testing - 模拟 EntityManager (Mockito)

python - zipfile 无法处理某些类型的 zip 数据?

Python:优化循环

Python程序,方便用户查询

python - 拆分数据框中的字符串

python - 如何以编程方式将方法添加到类调用中?

Python - 模拟操作系统错误异常

php - 如何对事件记录模式静态方法进行单元测试?

python - 如何在 python 脚本中使用名称 ("Web Content") 中的空格来 pkill 进程