Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад

Что такое side_effect в моках и зачем он нужен?

Вопрос проверяет понимание тестовых дублёров, умение управлять поведением моков и моделировать ошибки/последовательности вызовов.

Короткий ответ

side_effect задаёт “поведение” мока при вызове: он может выбрасывать исключение, возвращать разные значения по очереди или вызывать функцию. Это нужно, чтобы в тестах воспроизводить реальные сценарии: временные сбои, ретраи, разные ответы. Такой контроль делает тесты ближе к реальности и помогает покрывать негативные ветки.

Длинный ответ

Определение

side_effect — это механизм в unittest.mock (и совместимых инструментах), который определяет, что произойдёт при вызове мока: возврат значения, исключение, последовательность значений или выполнение функции.


Зачем нужен side_effect

Перед примерами важно разделить два понятия:

  1. return_value — всегда возвращает одно и то же

  2. side_effect — позволяет моделировать динамическое поведение

Это критично, когда код зависит от:

  • последовательности вызовов

  • временных ошибок

  • разных ответов внешнего сервиса


Типовые сценарии использования

1) Сымитировать исключение

Например, внешний клиент падает, и вы проверяете обработку ошибки.

from unittest.mock import Mock
import pytest

def call_service(client):
    return client.fetch()

def test_call_service_raises():
    client = Mock()
    client.fetch.side_effect = TimeoutError("timeout")

    with pytest.raises(TimeoutError, match="timeout"):
        call_service(client)

2) Вернуть разные значения по очереди

Полезно для ретраев: сначала ошибка, потом успех.

from unittest.mock import Mock

def get_with_retry(client):
    try:
        return client.fetch()
    except TimeoutError:
        return client.fetch()

def test_retry_success_after_failure():
    client = Mock()
    client.fetch.side_effect = [TimeoutError(), {"ok": True}]

    assert get_with_retry(client) == {"ok": True}
    assert client.fetch.call_count == 2

3) Выполнить функцию вместо мока

Это удобно, когда хотите сохранить логику вычисления, но контролировать окружение.

from unittest.mock import Mock

def test_side_effect_function():
    def fake_fetch(x):
        return {"id": x}

    client = Mock()
    client.fetch.side_effect = fake_fetch

    assert client.fetch(10) == {"id": 10}

Где часто ошибаются

1) Слишком сложная логика в side_effect

Если side_effect превращается в мини-сервис, тест становится тяжёлым. Лучше:

  1. держать side_effect коротким

  2. выносить сложное в helper-функцию

  3. оставлять смысл теста очевидным


2) Не проверяют количество вызовов

Если вы моделируете ретраи, важно фиксировать контракт:

assert client.fetch.call_count == 2

3) Путают с return_value

Если нужно всегда одно значение — используйте return_value, это проще и читабельнее.


Как выбирать между return_value и side_effect

Перед коротким списком важно обозначить правило выбора:

  • если поведение статичное → return_value

  • если поведение меняется или нужно исключение → side_effect

  1. Одно значение всегда → return_value

  2. Исключение → side_effect = SomeError(...)

  3. Последовательность значений → side_effect = [.., ..]

  4. Логика на аргументах → side_effect = function


Краткий вывод

side_effect — инструмент для моделирования “реальной жизни” в тестах: ошибок, последовательных ответов и вычисляемого поведения. Он делает тесты точнее, особенно для ретраев и обработки исключений, но его стоит держать простым и проверяемым.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • PyTest

Ключевые слова

#mock

#side_effect

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.