如何解决如何模拟和测试装饰器?
如何测试以下调用第3方库的装饰器?
import third_party_lib
import functools
class MyDecorator:
def __init__(self,....):
self.third_party_lib = ThirdPartyLib(....) # will create a 3rd party instance
def __call__(self,...):
def decorator(f):
@functools.wraps(f)
def wrap(*arg,**kwargs):
result = f(*arg,**kwargs)
# ....
a = self.third_party_lib.send(value=result).get()
# ....
return result
return wrap
return decorator
我需要创建一个单元测试来断言third_party_lib.send()
是否被装饰器装饰了。理想情况下,还要确保将测试功能的结果传递给该功能。
decorator = MyDecorator(....)
@decorator(....)
def test_func():
ret = ...
return ret # ret should be passed to `third_party_lib.send()`
解决方法
如果要验证是否正确调用了第三方函数,可以对其进行模拟并检查是否使用正确的参数调用了该模拟。如评论中所述,由于ThirdPartyLib
初始化也应被模拟,因此您必须确保在设置模拟后构造docorator,例如通过在测试内部对其进行构造:
from unittest import mock
@mock.patch('third_party_lib.ThirdPartyLib')
def test_my_decorator(mocked_lib):
decorator = MyDecorator()
@decorator()
def example_func():
return 42
example_func()
mocked_lib.return_value.send.assert_called_once_with(value=42)
如果需要在更多测试中使用修饰的函数,则可以将其包装在函数中:
def decorated_func():
decorator = MyDecorator()
@decorator()
def example_func():
return 42
return example_func
@mock.patch('third_party_lib.ThirdPartyLib')
def test_my_decorator(mocked_lib):
decorated_func()()
mocked_lib.return_value.send.assert_called_once_with(value=42)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。