Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to permanently mock return value of a function in python unittest

I have a function

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

I want to mock this function such that whenever this function is called, it returns a certain value. I've tried patching like such

# 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

I want to deeply modify this function to always return this value, whether this function is called directly from the unittest or not.

For context, I have a number of production shards (10) and one test shard (11). The get_shard function is called in numerous and the production version of the function is only aware of 10 shards. So, I would like for this function to always return 11 (test shard number) when executed in the context of a unit test.

like image 394
vgbcell Avatar asked May 14 '19 22:05

vgbcell


1 Answers

The mock.patch method is meant to temporarily mock a given object. If you want to permanently alter the return value of a function, you can simply override it by assigning to it with a Mock object with return_value specified:

import foo
from unittest.mock import Mock
foo.get_shard = Mock(return_value=11)
like image 186
blhsing Avatar answered Nov 05 '22 13:11

blhsing