只需在foo模块之前导入bar模块并模拟它:
from mock import Mock
from dirBar import bar
bar.returnBar = Mock(return_value='Foo')
from foo import printFoo
printFoo()
在foo.py中导入returnBar时,您将模块的值绑定到一个名为returnBar的变量。这个变量是本地的,所以当foo被导入时,它被放在printFoo()函数的关闭中,并且闭包中的值不能通过outiside它的代码更新。因此,在导入foo之前应该有新的值(即嘲笑功能)。
编辑:以前的解决方案工作,但不稳定,因为它取决于订购进口。那不是很理想另一个解决方案(在第一个之后发生的)是在foo.py中导入bar模块,而不是仅导入returnBar()函数:
from dirBar import bar
def printFoo():
print bar.returnBar()
这将工作,因为returnBar()现在直接从bar模块而不是关闭。所以如果我更新模块,将检索新的功能。