刚升级到Django 1.3。我每次检查给定的URL是404时,我的测试套件现在都会显示一堆无用的警告。它在Django 1.2下没有这样做。
例如,假设我们有连接的视图和URL,以便此测试通过:
def test_foo(self):
response = self.client.get('/foo/bar/')
self.assertEqual(response.status_code, 200)
response = self.client.get('/foo/bar2/')
self.assertEqual(response.status_code, 404)
虽然测试通过,但404(我们期望)会触发对控制台的警告:
。警告未找到:/ foo / bar2 /
这只是无用的噪音;我目前的一个测试套件中有大约30个。
有没有办法在测试期间让那些沉默?我想在正常操作期间让它们保持开启状态。而且我认为我不想过滤掉'django.request'记录器中的所有警告。
答案 0 :(得分:14)
警告来自这里: http://code.djangoproject.com/svn/django/trunk/django/core/handlers/base.py
你想要做的是在测试开始时将'django.request'模块的记录阈值设置为高于WARNING的值(例如ERROR),然后再将其设置回来。
尝试这样的事情:
import logging
#before tests
logger = logging.getLogger('django.request')
previous_level = logger.getEffectiveLevel()
logger.setLevel(logging.ERROR)
#after tests
logger.setLevel(previous_level)
答案 1 :(得分:6)
我知道有些年过去了,但是对于寻找这个问题的其他人来说,以下内容可能会有所帮助。
基于@jterrace解决方案,您可以轻松实现这样的装饰器功能:
import logging
def prevent_request_warnings(original_function):
"""
If we need to test for 404s or 405s this decorator can prevent the
request class from throwing warnings.
"""
def new_function(*args, **kwargs):
# raise logging level to ERROR
logger = logging.getLogger('django.request')
previous_logging_level = logger.getEffectiveLevel()
logger.setLevel(logging.ERROR)
# trigger original function that would throw warning
original_function(*args, **kwargs)
# lower logging level back to previous
logger.setLevel(previous_logging_level)
return new_function
使用此功能,您可以编写如下代码:
@prevent_request_warnings
def test_foo(self):
response = self.client.get('/foo/bar/')
self.assertEqual(response.status_code, 200)
response = self.client.get('/foo/bar2/')
self.assertEqual(response.status_code, 404)
答案 2 :(得分:0)
实现@jterrace 解决方案的一个解决方案是降低 setUp 和 tearDown 方法中的日志级别:
class NotFoundTests(TestCase):
def setUp(self) -> None:
"""Reduce the log level to avoid errors like 'not found'"""
logger = logging.getLogger("django.request")
self.previous_level = logger.getEffectiveLevel()
logger.setLevel(logging.ERROR)
def tearDown(self) -> None:
"""Reset the log level back to normal"""
logger = logging.getLogger("django.request")
logger.setLevel(self.previous_level)
只需复制/粘贴到 TestCase 类,其中包含检查未找到页面的测试。