2011-06-16 49 views
9

刚刚升级到Django 1.3。我的测试套件现在每次检查给定的URL是404时都会显示一堆无用的警告。它在Django 1.2中没有这样做。在django测试运行期间避免404上的警告?

例如,假设我们有意见和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(我们希望)触发警告控制台:

.WARNING Not Found:/ foo/bar2/

这只是无用的噪音;我目前的测试套件中有大约30个。

有没有办法在测试期间让那些沉默?我想在正常操作期间让他们继续。我不认为我想过滤掉'django.request'记录器中的全部警告。

回答

11

警告是从这里来的: http://code.djangoproject.com/svn/django/trunk/django/core/handlers/base.py

你想要做的是设置“django.request”模块的日志记录阈值以上的东西警告(例如ERROR)在测试开始时什么,然后放回去。

尝试这样:

import logging 

#before tests 
logger = logging.getLogger('django.request') 
previous_level = logger.getEffectiveLevel() 
logger.setLevel(logging.ERROR) 

#after tests 
logger.setLevel(previous_level) 
+0

是的,我希望的是懒惰解。这是正确的方法,但现在我只需在settings.LOGGING中执行相同的配置即可。 – slinkp 2011-06-17 02:53:18

+0

是的,问题是无论如何,异常子句都会输出警告,所以不幸的是,要让它停止的唯一方法就是降低日志级别。 – jterrace 2011-06-17 16:38:40

+6

不要懒惰。我是一个可怜的混蛋,在你开始下一份工作之后,他将不得不清理那些代码。 – 2011-06-22 00:42:24

1

我知道有些年通过但对于其他人寻找这个问题下面可能会有所帮助过去了。

基于@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)