首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python的嘲弄: mock.patch.object抓到

python的嘲弄: mock.patch.object抓到
EN

Stack Overflow用户
提问于 2015-08-27 17:57:35
回答 2查看 328关注 0票数 1

我已经写了一年多的单元测试,而且几乎所有的东西(模块、类等)都使用patch.object。

我的同事说,永远不要使用patch.object来修补模块中的对象(例如,patch.object(socket, 'socket'),而应该始终使用patch('socket.socket')

我更喜欢patch.object方法,因为它允许我导入模块,而且在我看来,它更像丙酮。我的同事是对的吗?

注意:我查看了补丁文档,找不到关于这个主题的任何警告。在python中,不是所有东西都是对象吗?

EN

回答 2

Stack Overflow用户

发布于 2015-08-27 18:00:55

没有这样的要求,是的,所有东西都是Python中的一个对象。

这不过是一种风格选择;您是自己导入模块,还是patch为您处理这个问题?因为这是这两种方法之间唯一的区别;要么是patch()导入模块,要么是您导入。

对于测试中的代码,我更希望mock.patch()来处理这个问题,因为这样可以确保导入在测试运行时发生。这确保了我获得测试错误状态(测试失败),而不是在加载测试时出现问题。所有其他模块都是公平的。

票数 1
EN

Stack Overflow用户

发布于 2015-08-27 18:22:08

看一下模拟源代码,看起来真的没有什么区别。

为了进行调查,我首先看了一下def patch,发现它是这样做的:

代码语言:javascript
复制
  getter, attribute = _get_target(target)
  return _patch(
     getter, attribute, new, spec, create,
     spec_set, autospec, new_callable, kwargs)

patch.object做同样的事情,除了:getter = lambda: target

那么这个_get_target是做什么的呢?它很大程度上拆分了字符串,并在第一部分调用_importer (创建对象),并以与get_object相同的方式使用字符串。

_importer是一种从模块导入的非常简单的机制(对每个“组件”都使用getattr ),并且非常清楚地只是创建了一个对象。

因此,从根本上说,在源级别上,并没有真正的区别。

案例封闭式

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32256361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档