编辑:由于韧度是最近的重试方法,因此可以将该问题视为链接问题的重复,而解决方案是升级为韧度。
类似于this question,我想对python中具有重试装饰器的函数进行单元测试:
from retrying import retry # from retrying pypi module
WAIT_EXPONENTIAL_MULTIPLIER = 4 * 1000 # ms
STOP_MAX_ATTEMPT_NUMBER = 5
@retry(
wait_exponential_multiplier=WAIT_EXPONENTIAL_MULTIPLIER,
stop_max_attempt_number=STOP_MAX_ATTEMPT_NUMBER
)
def get_from_remote(key):
raise ValueError() # for example
在单元测试中,我想有时不完全重试而有时用不同的参数来调用此函数。
我尝试在setUp()/tearDown()
中设置变量,但是没有用。我尝试修补重试装饰器,但也没有用。
答案 0 :(得分:0)
由于行
不确定是否可行Retrying(*dargs, **dkw).call(f, *args, **kw)
在retrying
中。 Retrying
实例是在函数运行时即时创建的,无法再更改其属性。
一种方法可能是保留未修饰的对 在运行时发挥作用并装饰老式玩具。
from retrying import retry
WAIT_EXPONENTIAL_MULTIPLIER = 1 * 1000 # ms
# the "normal" decorator
retry_dec = retry(wait_exponential_multiplier=WAIT_EXPONENTIAL_MULTIPLIER)
# the undecorated function
def get_from_remote_undecorated(key):
raise ValueError()
# this is the "normal" decorated function
get_from_remote = retry_dec(get_from_remote_undecorated)
这可以在单元测试中重复:
# some test
retry_dec_test_1 = retry(wait_exponential_multiplier=WAIT_EXPONENTIAL_MULTIPLIER)
get_from_remote_test_1 = retry_dec_test_1(get_from_remote_undecorated)
# another test with different parameters
retry_dec_test_2 = retry(stop_max_attempt_number=STOP_MAX_ATTEMPT_NUMBER)
get_from_remote_test_2 = retry_dec_test_2 (get_from_remote_undecorated)
但是我对这种方法并不十分满意,并将尝试找到更好的解决方案。