0

编辑:由于韧度是最近的重试,这个问题可以被认为是链接问题的重复,解决方案是升级到韧度。

此问题类似,我想在 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(),但它不起作用。我尝试修补重试装饰器,但它也不起作用。

4

1 回答 1

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)

但我对这种方法并不满意,并将尝试找到更好的解决方案。

于 2019-06-19T06:10:46.553 回答