如何使用 'with' 语句对 Python 锁进行单元测试?

How to unittest Python Lock is acquired with 'with' statement?

使用 Python 2.6.6

所以我刚刚了解到以下内容:

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

可以替换为:

with myLock:
  doStuff()

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

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

with 语句在开始和结束(分别)内部调用了 __enter____exit__ 魔法方法。您可以通过使用 MagicMock 或显式设置 mock.__enter__ = Mock();mock.__exit__ = Mock().

来模拟这些方法

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