2011-06-16 58 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)