Как я могу смоделировать класс зависимости в модуле, который я тестирую с помощью pytest? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть тестовый модуль, 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 не используются ленивые соединения, невозможность смоделировать перед первым импортом означает, что мы получим ошибку при импорте ролей.

1 Ответ

0 голосов
/ 03 мая 2018

roles.py использует roles.MongoClient, а не pymongo.MongoClient, чтобы определить roles.client из-за того, как вы импортировали имя. Вам нужно патч же:

monkeypatch.setattr(roles, 'MongoClient', FakeMongoClient)

Ваш оригинальный патч должен работать, если roles.py выглядел как

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