gpt4 book ai didi

python - 测试装饰器参数

转载 作者:行者123 更新时间:2023-12-01 09:02:21 25 4
gpt4 key购买 nike

我有一个接受两个参数callbackonerror的装饰器,两者都应该是像这样的可调用

class mydecorator(object):
def __init__(self, callback, onerror=None):
if callable(callback):
self.callback = callback
else:
raise TypeError('Callable expected in "callback" parameter')

self.onerror = onerror
if self.onerror and not callable(self.onerror):
raise TypeError('Callable expected in "onerror" parameter')

def __call__(self, func):
return self.__param__call__(func)

def __param__call__(self, func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
try:
self.callback()
except MyCustomException as e:
if self.onerror:
self.onerror(e.message, e.data)
else:
raise

return result
return wrapper

我想测试传递的参数无效,例如不可调用的参数,它应该引发 TypeError

使用 Python unittest 实现此目的的最佳方法是什么?我愿意做这样的事情:

def test_non_callable_callback_should_return_type_error(self):
try:
@mydecorator('this_is_not_a_callable')
def my_phony_func():
pass
except TypeError:
# Correctly has raised a TypeError, lets just pass
pass
else:
# It has not raised an TypeError, let's fail
self.fail('TypeError not raised when a non callable passed to callback')

这一定是更好的方法,不是吗?

最佳答案

Leo K评论说,有一种更简单的方法来测试某些代码是否在测试中引发异常,尽管不同的库的拼写略有不同。在 unittest.TestCase ,您可以使用self.assertRaises作为上下文管理器:

def test_non_callable_callback_should_return_type_error(self):
with self.assertRaises(TypeError):
@mydecorator('this_is_not_a_callable')
def my_phony_func():
pass

事实上,您可以通过删除正在测试的代码中不必要的部分来进一步简化事情。既然您期望 mydecorator类在调用时(而不是在函数上调用实例时)引发异常,您可以摆脱虚拟函数并跳过 @decorator语法全部放在一起。 assertRaises方法甚至可以为您调用电话:

def test_non_callable_callback_should_return_type_error(self):
self.assertraises(TypeError, mydecorator, 'this_is_not_a_callable')

关于python - 测试装饰器参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52373147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com