模拟模块的方法

时间:2014-08-15 13:20:40

标签: python mocking pytest

我正在使用模拟1.0.1。我几乎找到了模仿一切的方法。它是一个强大的工具。

我将所有配置都放在一个名为algo_config的模块中。

结构大致如下:

--text
----algo_config

我试过了

with patch('text.algo_config') as Mockconfig:
    ....

但它给了我一个错误说基本上文本模块没有属性algo_config,似乎模块不能以这种方式进行模拟。

有没有办法直接模拟模块而不是逐个模拟每个属性和函数的类?

1 个答案:

答案 0 :(得分:0)

问题的核心是修补覆盖名称而不是值。如果一个模块import text.algo_config,它现在有一个名为text.algo_config的本地名称,指向模块,但与其他模块中使用的名称完全无关。他们只是命名相同。 (这就是为什么import foo as bar有效 - 它只是名称。)修补对该模块的另一个引用不会影响此引用。

您有两种选择。您可以修改模块引用,也可以影响将来的导入。

您最想要的解决方案是前者。您不修补模块,而是修改您关心的模块。例如,假设您正在测试frobnicator.py。该模块执行from text import algo_config。然后,您可以使用with patch('frobnicator.algo_config') as algo_config,这将影响algo_configfrobnicator的所有使用。

或者,您也可以将模拟放入sys.modules,这会影响 future import语句。也就是说,任何已经运行的import语句都会导入旧值;并且在此修补程序存在期间运行的任何import语句将导入模拟对象,但不会还原为实际模块。这非常易变,可能不是你想要的。

相关问题