在python中模拟整个模块

祖尔艾尔

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

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

try: 
    except ImportError:

并捕获该导入错误,然后使用command_module.run()。这似乎很冒险/很丑,我想知道是否还有另一种方法。

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

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

唐·柯比

如果您想深入研究Python导入系统,我强烈建议David Beazley的演讲

至于您的特定问题,下面是一个示例,该示例在缺少模块依赖项时对其进行测试。

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-测试bar.py何时my_bogus_module不可用

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如果失败则返回方法这似乎是一种公共方法,但是并没有真正记录在案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章