需要注意的是,第二次导入模块时,
   
    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
    
   
   .