我有一个芹菜重试任务,我想测试它重试,直到成功.使用mock的side_effect,我可以在一定数量的执行中失败,然后传递None,清除副作用.但是,任务调用的方法不会在该点执行,它只是没有异常.有没有办法清除副作用,仍然有被模拟的方法执行正常?
我可以测试它被称为'x'次(即重复直到成功)然后在一个单独的测试中断言它做了应该做的,但是想知道是否有办法在一次测试中同时做两件事.
tasks.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
Run Code Online (Sandbox Code Playgroud)
测试:
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]
Run Code Online (Sandbox Code Playgroud)
结果:失败三次然后"成功"但do_something()从未打印.
action.call_count等于4.我希望看到最后一个'HERE'后面的空白行将打印出'TASK'.
-------------------- >> begin captured stdout << ---------------------
HERE
First
HERE
Second
HERE
Third
HERE
--------------------- >> end captured stdout << ----------------------
Run Code Online (Sandbox Code Playgroud)