gpt4 book ai didi

python - 在 python 中模拟整个模块

转载 作者:太空狗 更新时间:2023-10-29 20:58:02 25 4
gpt4 key购买 nike

我有一个从 PyPI 导入模块的应用程序。我想为该应用程序的源代码编写单元测试,但我不想在这些测试中使用 PyPI 中的模块。
我想完全模拟它(测试机将不包含该 PyPI 模块,因此任何导入都会失败)。

目前,每次我尝试加载我想在单元测试中测试的类时,我都会立即收到导入错误。所以我想也许使用

try: 
except ImportError:

并捕获该导入错误,然后使用 command_module.run()。这看起来很冒险/丑陋,我想知道是否还有其他方法。

另一个想法是编写一个适配器来包装 PyPI 模块,但我仍在努力。

如果你知道我可以模拟整个 python 包的任何方法,我将非常感激。谢谢。

最佳答案

如果你想深入了解 Python 导入系统,我强烈推荐 David Beazley's talk .

至于您的具体问题,这里有一个在缺少依赖项时测试模块的示例。

bar.py - 缺少 my_bogus_module 时要测试的模块

from my_bogus_module import foo

def bar(x):
return foo(x) + 1

mock_bogus.py - 包含您的测试的文件,将加载模拟模块

from mock import Mock
import sys
import types

module_name = 'my_bogus_module'
bogus_module = types.ModuleType(module_name)
sys.modules[module_name] = bogus_module
bogus_module.foo = Mock(name=module_name+'.foo')

test_bar.py - 当 my_bogus_module 不可用时测试 bar.py

import unittest

from mock_bogus import bogus_module # must import before bar module
from bar import bar

class TestBar(unittest.TestCase):
def test_bar(self):
bogus_module.foo.return_value = 99
x = bar(42)

self.assertEqual(100, x)

您可能应该通过在运行测试时检查 my_bogus_module 实际上不可用来使它更安全一些。您还可以查看 pydoc.locate() 方法,该方法将尝试导入某些内容,如果失败则返回 None。它似乎是一个公共(public)方法,但并没有真正记录下来。

关于python - 在 python 中模拟整个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41220803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com