Как навсегда смоделировать возвращаемое значение функции в тесте Python - PullRequest
2 голосов
/ 15 мая 2019

У меня есть функция

# 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 Ответ

1 голос
/ 15 мая 2019

Метод mock.patch предназначен для временного издевательства над данным объектом. Если вы хотите навсегда изменить возвращаемое значение функции, вы можете просто переопределить его, присвоив ему объект Mock с указанным return_value:

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