У меня есть тестовый модуль, test_roles.py
, который пытается проверить модуль roles.py
. Я хочу исключить использование MongoClient
из pymongo
в модуле ролей, чтобы мои модульные тесты не полагались на внешнюю службу. Ниже приведен упрощенный пример того, что я делаю, и это не работает для меня. Как мне заставить это работать, чтобы я мог фальсифицировать MongoClient
везде?
В roles.py
:
from pymongo import MongoClient
client = MongoClient(...)
В test_roles.py
:
import roles
def test_mock():
assert type(roles.client).__name__ == 'FakeMongoClient'
В conftest.py
:
import pytest
import pymongo
@pytest.fixture(autouse=True)
def fake_mongo(monkeypatch):
class FakeMongoClient():
pass
monkeypatch.setattr(pymongo, 'MongoClient', FakeMongoClient)
Я не верю, что вопрос, обозначенный как дубликат, задает то же самое. Редактирование глобальной переменной модуля после факта отличается от изменения зависимости, так что действия, которые происходят во время импорта, используют ложную зависимость. В этом примере, если в инициализации MongoClient
не используются ленивые соединения, невозможность смоделировать перед первым импортом означает, что мы получим ошибку при импорте ролей.