Back to questions
Junior — Middle
56
Каким образом реализовать так, чтобы при последовательных вызовах объекта mock возвращались различные значения?
Answer from AI
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