模块A包括import B在其顶部.然而在试验条件下,我想嘲笑 B的A(模拟A.B)和进口完全避免B.
实际上,B并非故意安装在测试环境中.
A是被测单位.我必须导入A及其所有功能.B是我需要模拟的模块.但是我如何在A中模拟B并阻止A导入真实B,如果A做的第一件事就是导入B?
(没有安装B的原因是我使用pypy进行快速测试,不幸的是B还与pypy不兼容.)
怎么可以这样做?
我有一个用于 python 3.5 和 3.6 的包,它具有可选的依赖项,我想要在任一版本上运行的测试 (pytest)。
我在下面做了一个由两个文件组成的简化示例,一个简单__init__.py的示例,其中导入了可选包“请求”(只是一个示例),并设置了一个标志来指示请求的可用性。
mypackage/
??? mypackage
? ??? __init__.py
??? test_init.py
Run Code Online (Sandbox Code Playgroud)
该__init__.py文件的内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
requests_available = True
try:
import requests
except ImportError:
requests_available = False
Run Code Online (Sandbox Code Playgroud)
该test_init.py文件的内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pytest, sys
def test_requests_missing(monkeypatch):
import mypackage
import copy
fakesysmodules = copy.copy(sys.modules)
fakesysmodules["requests"] = None
monkeypatch.delitem(sys.modules,"requests")
monkeypatch.setattr("sys.modules", fakesysmodules)
from importlib import reload
reload(mypackage)
assert mypackage.requests_available == False
if __name__ == '__main__': …Run Code Online (Sandbox Code Playgroud)