我已经写了一年多的单元测试,而且几乎所有的东西(模块、类等)都使用patch.object。
我的同事说,永远不要使用patch.object来修补模块中的对象(例如,patch.object(socket, 'socket'),而应该始终使用patch('socket.socket')。
我更喜欢patch.object方法,因为它允许我导入模块,而且在我看来,它更像丙酮。我的同事是对的吗?
注意:我查看了补丁文档,找不到关于这个主题的任何警告。在python中,不是所有东西都是对象吗?
发布于 2015-08-27 18:00:55
没有这样的要求,是的,所有东西都是Python中的一个对象。
这不过是一种风格选择;您是自己导入模块,还是patch为您处理这个问题?因为这是这两种方法之间唯一的区别;要么是patch()导入模块,要么是您导入。
对于测试中的代码,我更希望mock.patch()来处理这个问题,因为这样可以确保导入在测试运行时发生。这确保了我获得测试错误状态(测试失败),而不是在加载测试时出现问题。所有其他模块都是公平的。
发布于 2015-08-27 18:22:08
看一下模拟源代码,看起来真的没有什么区别。
为了进行调查,我首先看了一下def patch,发现它是这样做的:
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 ),并且非常清楚地只是创建了一个对象。
因此,从根本上说,在源级别上,并没有真正的区别。
案例封闭式
https://stackoverflow.com/questions/32256361
复制相似问题