python - 是否可以在Python测试中模拟模块不可用的情况?

标签 python python-unittest

我编写了一个 Python 程序,它在 Unix 系统上使用 resource 模块来执行一些计时操作,但在 Windows 上又使用 time 模块(因为 resource 模块不可用)。代码看起来大致如下:

try:
    import resource
except ImportError:
    import time
    def fn():
        # Implementation using the time module
else:
    def fn():
        # Implementation using the resource module

但是,我的测试目前仅执行 else block 中的函数,因为 resource 模块在 Linux 上始终可用。有没有办法模拟内置模块的不可用性,以便我也可以测试基于时间的函数?我浏览了 mock 文档,但找不到任何与此相关的具体内容。

最佳答案

这有点乱,但你可以创建一个目录,其中包含一个名为 resource.py 的文件。这引发了 ImportError ,并将该目录的路径添加到 sys.path 前面.

如果您想将模拟测试与未模拟测试混合在一起,您还必须从 sys.modules 中删除模块。当您想重试导入它时,否则更改为 sys.path不会有任何影响。如果存在子模块,则可能存在进一步的问题。

概念证明:

mocked_modules/resource.py :

raise ImportError()

测试代码:

import sys
import os

original_path = sys.path[:]
def reset():
    # Teardown
    sys.path = original_path[:]
    if "resource" in sys.modules:
        del sys.modules["resource"]


import resource
print("resource exists")

reset()

sys.path.insert(0, os.path.join(os.getcwd(), "mocked_modules"))


try:
    import resource
except ImportError:
    print("resource does not exist")

reset()
import resource
print("resource exists")

输出:

resource exists
resource does not exist
resource exists

考虑到它有很多警告(参见 this question ),这让我感到有点不安,因此,如果是您的代码执行导入,您可能更愿意将导入抽象为函数并模拟它。或者或此外,您可以公开“使用时间模块的实现”并直接测试它。

关于python - 是否可以在Python测试中模拟模块不可用的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29057954/

相关文章:

python - 如果不存在并基于 2 列条件,则在 df pandas 中添加行

python - FastAPI - 模拟路径功能没有效果

python - 使用 lambda 函数更改属性的值

python - 相机标定opencv python鸟瞰视角变换

python - Fedora 17 中的 vpython GdkGLExt-警告

python - 在python中模拟全局变量

python - 模拟 attr.ib() 的默认值

python-2.7 - Python 模拟 Autospec 与 Spec

python - 发现后过滤测试

python - Vim Python 补全