2012-02-03 71 views
4

我想爲一段代碼編寫一個單元測試,用於檢查標頭是否丟失。我怎樣才能從Django的測試客戶端中省略http_referer頭文件(或任何頭文件)?Django測試客戶端:如何刪除http標頭

from django.test.client import RequestFactory 
from django.test import TestCase 

from yourapp.view import yourfunction 

class YourTest(TestCase) 
    def setUp(self): 
     self.factory = RequestFactory() 

    def testCase(self): 
     request = self.factory.get('/yoururl/') 
     del request.META['HTTP_REFERER'] 
     yourfunction(request) 

回答

3

除了使用內置的測試客戶端,你可以使用Django's RequestFactory建立你的請求,然後調用你的函數之前修改請求對象客戶端,在這種情況下。如果您修改測試客戶端的行爲,然後通過它發出請求,那麼您就不會根據實際需要處理的輸入來測試代碼。

您不應該相信測試客戶端以與WSGI客戶端完全相同的方式構建HTTP請求。它將一個請求參數傳遞到你的視圖中,但它確實與你從一個真實的請求中得到的結果不一樣。

測試客戶端的目的是爲了保護您免受實際請求和響應對象的所有混亂細節的影響,並讓您測試視圖如何響應輸入參數。但就你而言,你需要測試這些細節。

您應該構建一個HTTPRequest對象,方法與Django相同 - 使用盡可能多的Django函數來構建它,然後直接使用該HTTPRequest對象調用視圖或中間件。如果你的視圖應該引發異常,那麼使用assertRaises來測試它。如果它應該返回狀態碼設置爲500的HTTPResponse,那麼測試 - 或者如果需要,可以使用自定義斷言方法測試它們。

0

不要去通過測試:

def testCase(self): 
    response = self.client.get('/some_url/') 
    self.assertNotEqual(500, response.status_code)