Sobes.tech
Назад к вопросам
Junior — Middle
57

Каким образом реализовать так, чтобы при последовательных вызовах объекта mock возвращались различные значения?

Ответ от нейросети

sobes.tech AI

В Python с использованием библиотеки unittest.mock можно настроить мок так, чтобы при последовательных вызовах возвращались разные значения, используя атрибут side_effect.

Пример:

from unittest.mock import Mock

mock_obj = Mock()
mock_obj.method.side_effect = [1, 2, 3, 4]  # при каждом вызове будет возвращаться следующее значение из списка

print(mock_obj.method())  # 1
print(mock_obj.method())  # 2
print(mock_obj.method())  # 3
print(mock_obj.method())  # 4

Если side_effect — это список, то при каждом вызове мок возвращает следующий элемент списка. Когда элементы заканчиваются, будет выброшено исключение StopIteration.

Также side_effect может быть функцией, которая возвращает разные значения в зависимости от логики.

Пример с функцией:

def side_effect_func():
    values = [10, 20, 30]
    for v in values:
        yield v

gen = side_effect_func()
mock_obj.method.side_effect = lambda: next(gen)

print(mock_obj.method())  # 10
print(mock_obj.method())  # 20
print(mock_obj.method())  # 30