需要注意的是,第二次导入模块时,
it would not be loaded again
,您将获得与第一次导入时相同的模块对象。
第一次运行“test\u 1”时,
external_library.function_foo
替换为
Mock
对象,我们来命名它
mock_a
. 然后您的“模块”第一次被导入,python将加载它,意味着在“模块”内执行代码,这将把名称“function\u foo”绑定到“module”命名空间中的对象“mock\u a”,将“module”对象保存到
sys.modules
. 这次你的考试会通过,而且
side_effect
属于
模拟\u a
消费。
接下来是“test\u 2”,
external\u库。函数\u foo
替换为
嘲弄
对象,将其命名为
mock_b
. 然后导入“模块”,这次不会再次加载,而是从
系统。模块
,则得到与“test\u 1”中相同的模块对象。在此模块对象的命名空间中,名称“function\u foo”仍然绑定到对象
模拟\u a
,而不是新创建的
模拟\u b
. 因为
副作用
属于
模拟\u a
已消费,
StopIteration
出现错误。
您应该将修补程序应用于
名称
查找,但不在定义的位置:
@patch('module.function_foo', side_effect=[1, 2, 3])
def test_1(self, patch):
...
阅读有关
"Where to patch" section of the manual of
patch
.