2012-02-03 44 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)