我有一个测试模块,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
初始化使用延迟连接,否则在首次导入之前无法模拟意味着我们在导入角色期间会出现故障。
答案 0 :(得分:2)
roles.py
使用roles.MongoClient
而非pymongo.MongoClient
来定义roles.client
。你需要补丁:
monkeypatch.setattr(roles, 'MongoClient', FakeMongoClient)
如果roles.py
看起来像
import pymongo
client = pymongo.MongoClient()