相关疑难解决方法(0)

如何模拟导入

模块A包括import B在其顶部.然而在试验条件下,我想嘲笑 BA(模拟A.B)和进口完全避免B.

实际上,B并非故意安装在测试环境中.

A是被测单位.我必须导入A及其所有功能.B是我需要模拟的模块.但是我如何在A中模拟B并阻止A导入真实B,如果A做的第一件事就是导入B?

(没有安装B的原因是我使用pypy进行快速测试,不幸的是B还与pypy不兼容.)

怎么可以这样做?

python mocking python-import

126
推荐指数
6
解决办法
4万
查看次数

使用 pytest 测试 __init__.py 中可选依赖项的导入:Python 3.5 /3.6 的行为不同

我有一个用于 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)

python pytest python-3.5 python-3.6

6
推荐指数
1
解决办法
892
查看次数

标签 统计

python ×2

mocking ×1

pytest ×1

python-3.5 ×1

python-3.6 ×1

python-import ×1