У меня есть задача повторной попытки сельдерея, которую я хотел бы проверить, чтобы она повторялась до тех пор, пока она не будет успешной. Используя mock side_effect, я могу потерпеть неудачу в течение заданного количества выполнений, а затем, передав None
, очистить побочный эффект. Однако метод, который вызывает задача, в этот момент не выполняется, просто у него нет исключения. Есть ли способ устранить побочный эффект, и при этом метод, над которым издевались, выполнялся как обычно?
Я могу проверить, что он вызывается «x» несколько раз (т. е. повторять до тех пор, пока он не будет успешным), а затем в отдельном тесте утверждать, что он делает то, что должен, но мне было интересно, есть ли способ сделать оба в одном тесте.
Задачи.py:
import celery
@celery.task(max_retries=None)
def task():
print "HERE"
try:
do_something("TASK")
except Exception as exc:
print exc
raise task.retry(exc=exc)
def do_something(msg):
print msg
Контрольная работа:
import ....
class TaskTests(test.TestCase):
@mock.patch('tasks.do_something')
def test_will_retry_until_successful(self, action):
action.side_effect = [Exception("First"), Exception("Second"), Exception("Third"), None]
tasks.task.delay()
self.assert.... [stuff about task]
Результаты: три раза терпит неудачу, а затем «успешно», но do_something()
никогда не печатает. action.call_count
равно 4. Я хотел бы видеть, что пустая строка после последнего «ЗДЕСЬ» будет напечатана «ЗАДАЧА».
-------------------- >> begin captured stdout << ---------------------
HERE
First
HERE
Second
HERE
Third
HERE
--------------------- >> end captured stdout << ----------------------
do_something()
. Насмешка над методом не вызывает оригинал без побочных эффектов. - person Martijn Pieters   schedule 19.08.2015