是否可以在Python测试中模拟模块的不可用性?

时间:2015-03-15 06:36:32

标签: python python-unittest

我编写了一个Python程序,利用Unix系统上的resource模块进行一些计时操作,但是回归到在Windows上使用time模块(因为{{1}模块不可用)。代码看起来像这样:

resource

但是,我的测试目前只在try: import resource except ImportError: import time def fn(): # Implementation using the time module else: def fn(): # Implementation using the resource module 块中执行函数,因为else模块在​​Linux上始终可用。有没有办法模拟内置模块的不可用性,以便我也可以测试基于resource的函数?我查看了time文档,但没有找到任何具体内容。

1 个答案:

答案 0 :(得分:2)

它有点乱,但您可以使用名为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),这让我感到有些不安,所以如果您的代码执行导入,您可能更愿意将导入抽象为函数和嘲笑那个。或者或另外,您可以使用时间模块公开"实施"并直接测试。