一部のasyncioテストケースでは、メソッドが呼び出されるまで待つことがしばしばあるので、次のコンテキストマネージャを記述しました。mock.patch.objectを使用してクラスのすべてのオブジェクトにメソッドをラップする
@contextmanager
def wait_for_call(loop, obj, method, calls = 1):
# set up some bookkeeping including a future called fut
def cb(*args, **kwards):
# Set fut's result to true if the right number of calls happen
try:
with mock.patch.object(obj, method,
wraps = getattr(obj, method),
side_effect = cb):
yield
loop.run_until_complete(asyncio.wait_for(fut, 0.5))
except asyncio.futures.TimeoutError:
raise AssertionError("Timeout waiting for call to {} of {}".format(
method, obj)) from None
特定のインスタンスにパッチを当てている場合や、クラスメソッドにパッチを当てている場合はうまく機能します。私は、私が得ることを行うと
class foo:
def bar(self): pass
x = foo()
with wait_for_call(loop, x, 'bar'): x.bar()
TypeError
x.bar
ためにはself
を取得できません:しかし、私はこのような定期的な(インスタンス)メソッドにパッチを適用する例がいくつかあります。私は、MagicMock
は、関数と同じように記述子プロトコルを実装していないためだと思います。 メソッドをラップして、self
を正しく処理するにはどうすればよいですか?
これは機能しますか? 'w()'としてwait_for_call(...)をつけています。 – Dan
@Danもし私がそこに自信を持っていたら、それはおそらく役に立ちますが、私は通話中に深刻になるだろうグラフ。 –