使用Python 2.6.6
所以我刚学会了以下内容:
myLock.acquire()
doStuff()
myLock.release()
可以替换为:
with myLock:
doStuff()
我的问题在于,使用前面的代码,我可以通过模拟Lock来单元测试锁被用来保护做事。但是对于后者,我的单元测试现在(预期)失败,因为没有调用acquire()和release()。因此,对于后一种情况,我如何验证锁是否用于保护做事?
我更喜欢第二种方法,因为它不仅更简洁,而且我也不可能编写忘记解锁资源的代码。 (不是说我以前做过那个......)
答案 0 :(得分:6)
with
语句在内部(分别)开始和结束时调用__enter__
和__exit__
魔术方法。您可以使用MagicMock
或明确设置mock.__enter__ = Mock();mock.__exit__ = Mock()
来模拟这些方法。
这种方式设置魔法只适用于模拟;要覆盖非模拟对象上的魔术方法,您必须在类型上设置它。