У меня состояние гонки в 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)
перед утверждением, но это, очевидно, взломанно и хромотно - каков приемлемый способ издеваться над асинхронным материалом?