aboutsummaryrefslogtreecommitdiffstats
path: root/tests/helpers.py
diff options
context:
space:
mode:
authorGravatar Kieran Siek <[email protected]>2020-06-16 20:21:29 +0800
committerGravatar GitHub <[email protected]>2020-06-16 20:21:29 +0800
commit13ab8f1be24239cd9406547e16a90471e9b8652b (patch)
tree14af82dcd11e0cf2a434c71cd48a5395fbcd51ff /tests/helpers.py
parentRevise inaccurate docstring in RedisCache (diff)
parentLog exception info for failed attachment uploads (diff)
Merge branch 'master' into help_channel_rediscache
Diffstat (limited to 'tests/helpers.py')
-rw-r--r--tests/helpers.py20
1 files changed, 19 insertions, 1 deletions
diff --git a/tests/helpers.py b/tests/helpers.py
index faa839370..facc4e1af 100644
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -5,7 +5,7 @@ import itertools
import logging
import unittest.mock
from asyncio import AbstractEventLoop
-from typing import Iterable, Optional
+from typing import Callable, Iterable, Optional
import discord
from aiohttp import ClientSession
@@ -26,6 +26,24 @@ for logger in logging.Logger.manager.loggerDict.values():
logger.setLevel(logging.CRITICAL)
+def autospec(target, *attributes: str, **kwargs) -> Callable:
+ """Patch multiple `attributes` of a `target` with autospecced mocks and `spec_set` as True."""
+ # Caller's kwargs should take priority and overwrite the defaults.
+ kwargs = {'spec_set': True, 'autospec': True, **kwargs}
+
+ # Import the target if it's a string.
+ # This is to support both object and string targets like patch.multiple.
+ if type(target) is str:
+ target = unittest.mock._importer(target)
+
+ def decorator(func):
+ for attribute in attributes:
+ patcher = unittest.mock.patch.object(target, attribute, **kwargs)
+ func = patcher(func)
+ return func
+ return decorator
+
+
class HashableMixin(discord.mixins.EqualityComparable):
"""
Mixin that provides similar hashing and equality functionality as discord.py's `Hashable` mixin.