如何使用'with'语句获取单元测试Python Lock?

时间:2016-05-26 13:44:58

标签: python multithreading python-unittest

使用Python 2.6.6

所以我刚学会了以下内容:

myLock.acquire()
doStuff()
myLock.release()

可以替换为:

with myLock:
  doStuff()

我的问题在于,使用前面的代码,我可以通过模拟Lock来单元测试锁被用来保护做事。但是对于后者,我的单元测试现在(预期)失败,因为没有调用acquire()和release()。因此,对于后一种情况,我如何验证锁是否用于保护做事?

我更喜欢第二种方法,因为它不仅更简洁,而且我也不可能编写忘记解锁资源的代码。 (不是说我以前做过那个......)

1 个答案:

答案 0 :(得分:6)

with语句在内部(分别)开始和结束时调用__enter____exit__魔术方法。您可以使用MagicMock或明确设置mock.__enter__ = Mock();mock.__exit__ = Mock()来模拟这些方法。

这种方式设置魔法只适用于模拟;要覆盖非模拟对象上的魔术方法,您必须在类型上设置它。