我正在使用模拟1.0.1。我几乎找到了模仿一切的方法。它是一个强大的工具。
我将所有配置都放在一个名为algo_config的模块中。
结构大致如下:
--text
----algo_config
我试过了
with patch('text.algo_config') as Mockconfig:
....
但它给了我一个错误说基本上文本模块没有属性algo_config,似乎模块不能以这种方式进行模拟。
有没有办法直接模拟模块而不是逐个模拟每个属性和函数的类?
答案 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_config
中frobnicator
的所有使用。
或者,您也可以将模拟放入sys.modules
,这会影响 future import
语句。也就是说,任何已经运行的import语句都会导入旧值;并且在此修补程序存在期间运行的任何import语句将导入模拟对象,但不会还原为实际模块。这非常易变,可能不是你想要的。