在之前的一篇文章中,我演示了如何使用MagicMock的补丁来存根一个方法。但在那个例子中,有一个固有的问题。一旦你用字符串表示的方法打了补丁,以后的补丁就会变得无效/根本不起作用。让我用一个例子来证明这一点。
假设我想模拟 urllib.request.urlopen 以返回一个自定义的 MagicMock,我可以用补丁装饰器这样做。

上面的代码对于运行这个单一的测试来说是很好的。然而,如果你想在不同的测试中进一步模拟相同的方法,例如返回不同的错误,它将不会再次覆盖第一个补丁。这个问题,我不得不痛苦地发现,并得出结论,这不是覆盖/存根方法的正确方式,用于测试运行。
正确的模拟方式
上面的代码可以干净地写成这样。

这比第一个版本干净多了。如果你仔细观察,我所做的只是在setUp中对原始方法进行备份,并在tearDown中恢复原样。在这里,我可以为我的urlopen方法模拟很多不同的返回类型,在我的个别测试中。我花了很多时间来解决这个问题(第一个版本不起作用)。希望你不需要这样做!
弗朗西斯科技术 弗朗西斯科是一家技术公司,专注于以极快的速度提供高质量的规模软件。数据的数字和大小让我们兴奋。如果你在构建大规模应用程序方面有任何要求,或希望对你的系统或架构进行免费的健康检查,请随时向contact@francium.tech,我们会与你联系!
使用MagicMock在Python中潜伏更深的方法的正确方法最初发表在Medium上的Francium Tech,在那里人们通过强调和回应这个故事继续对话。