У меня состояние гонки в unittest, которое я пытаюсь исправить.
Предположим, есть модуль spam.py:
import threading
def foo(*args, **kwargs):
pass
def bar():
t = threading.Timer(0.5, foo, args=('potato',), kwargs={'x': 69, 'y':'spam'})
t.start()
И вот тест на это:
from mock import patch
from spam import bar
from unittest import TestCase
class SpamTest(TestCase):
def test_bar(self):
with patch('spam.foo') as mock:
bar()
mock.assert_called_once_with('potato', y='spam', x=69)
Конечно, этот тест завершился неудачно с AssertionError: Expected to be called once. Called 0 times. AssertionError: Expected to be called once. Called 0 times. потому что вызов bar() не блокируется, поэтому утверждение происходит слишком рано.
Тест может быть проделан, чтобы пройти, поставив time.sleep(1) перед утверждением, но это, очевидно, взломанно и хромотно - каков приемлемый способ издеваться над асинхронным материалом?