diff --git a/django/test/utils.py b/django/test/utils.py index 6187d3e2be..0e04e54964 100644 --- a/django/test/utils.py +++ b/django/test/utils.py @@ -634,6 +634,29 @@ class ignore_warnings(TestContextDecorator): self.catch_warnings.__exit__(*sys.exc_info()) +@contextmanager +def patch_logger(logger_name, log_level, log_kwargs=False): + """ + Context manager that takes a named logger and the logging level + and provides a simple mock-like list of messages received. + + Use unitttest.assertLogs() if you only need Python 3 support. This + private API will be removed after Python 2 EOL in 2020 (#27753). + """ + calls = [] + + def replacement(msg, *args, **kwargs): + call = msg % args + calls.append((call, kwargs) if log_kwargs else call) + logger = logging.getLogger(logger_name) + orig = getattr(logger, log_level) + setattr(logger, log_level, replacement) + try: + yield calls + finally: + setattr(logger, log_level, orig) + + # On OSes that don't provide tzset (Windows), we can't set the timezone # in which the program runs. As a consequence, we must skip tests that # don't enforce a specific timezone (with timezone.override or equivalent),