Пересмешивание модулей Python в нескольких тестовых скриптах - PullRequest
0 голосов
/ 15 ноября 2018

В моем скрипте реализации есть строка, которая записывает метрику:

from datadog import statsd

def some_function:
    statsd.increment('some_metric')

Из моего тестового сценария я утверждаю, что statsd.increment () вызывается путем макетирования модуля datadog:

datadog = Mock()
sys.modules['datadog'] = datadog

def test():
    some_function()
    datadog.statsd.increment.assert_called()

Это отлично работает и проходит. Но как только я добавляю ДРУГОЙ скрипт, который вызывает some_function() без насмешливого datadog, этот скрипт запускается заранее и загружает настоящий модуль datadog в кеш. Приведенный выше тест завершается ошибкой, поскольку some_function() больше не использует фиктивный журнал данных, а использует реальный (кэшированный) журнал данных.

Как я могу решить это? Можно ли удалить модуль из кеша?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Вы можете использовать unittest.mock.patch. Если вы используете pytest, вы можете сделать то же самое с прибором monkeypatch.

from datadog import statsd
from unittest.mock import Mock, patch

def some_function():
    statsd.increment()

def test_some_function():
    with patch('datadog.statsd', Mock()) as mock_statsd:
        some_function()
    mock_statsd.increment.assert_called()

test_some_function()
0 голосов
/ 16 ноября 2018

Вы пытались издеваться над модулем datalog внутри вашей функции test?Пока другие ваши скрипты не работают одновременно с вашим тестом, это может работать.Таким образом, сам макет будет установлен только при вызове функции, а не будет установлен в области видимости скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...