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

时间:2019-05-14 22:44:07

标签: 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

无论是否直接从unittest调用此函数,我都希望对该函数进行深度修改以始终返回此值。

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

1 个答案:

答案 0 :(得分:1)

mock.patch方法用于临时模拟给定的对象。如果要永久更改函数的返回值,只需使用指定了Mock的{​​{1}}对象将其赋值即可,以覆盖它:

return_value