使用 mock 修补函数时,您可以选择将 autospec 指定为 True:
如果您设置 autospec=True 则模拟将使用来自被替换对象的规范创建。模拟的所有属性也将具有被替换对象的相应属性的规范。被模拟的方法和函数将检查其参数,如果使用错误的签名调用它们,将引发 TypeError。
( http://www.voidspace.org.uk/python/mock/patch.html )
我想知道为什么这不是默认行为?当然,我们几乎总是希望捕捉到将不正确的参数传递给我们修补的任何函数?
原文由 seddonym 发布,翻译遵循 CC BY-SA 4.0 许可协议
解释这一点的唯一明确方法是实际引用有关使用自动指定的 缺点 的 文档 以及为什么在使用它时要小心:
我认为这里的关键要点是注意这一行: autospec can’t know about any dynamically created attributes and restricts the api to visible attributes
因此,为了帮助更明确地说明自动指定中断的示例,这个取自文档的示例显示了这一点:
如您所见,自动指定不知道在创建
Something
对象时创建了一个属性a
。为您的实例属性赋值没有错。
观察以下功能示例:
所以,我只是说对于我的测试用例,我想确保
some_external_thing()
方法不会影响我的单元测试的行为,所以我只是将我的实例属性分配给模拟mock_some_external_thing.return_value = "there be dragons"
。