如何在我用pytest测试的模块中模拟依赖关系的类?

时间:2018-05-03 19:23:36

标签: python pytest

我有一个测试模块,test_roles.py正在尝试测试模块roles.py。我想在角色模块中模拟MongoClientpymongo的使用,以便我的单元测试不依赖于外部服务。以下是我正在做的事情的一个简化示例,它不适用于我。如何让这个工作,以便我可以伪造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 :(得分:2)

由于您导入名称的方式,

roles.py使用roles.MongoClient而非pymongo.MongoClient来定义roles.client。你需要补丁:

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

如果roles.py看起来像

,原始补丁应该有效
import pymongo
client = pymongo.MongoClient()