65

我有一个功能

def getEvents(eid, request):
    ......

现在我想单独为上述函数编写单元测试(不调用视图)。那么我应该如何在TestCase. 是否可以创建请求?

4

5 回答 5

105

请参阅此解决方案

from django.utils import unittest
from django.test.client import RequestFactory

class SimpleTest(unittest.TestCase):
    def setUp(self):
        # Every test needs access to the request factory.
        self.factory = RequestFactory()

    def test_details(self):
        # Create an instance of a GET request.
        request = self.factory.get('/customer/details')

        # Test my_view() as if it were deployed at /customer/details
        response = my_view(request)
        self.assertEqual(response.status_code, 200)
于 2012-04-23T09:21:37.940 回答
43

如果您使用 django 测试客户端 ( from django.test.client import Client),您可以像这样访问来自响应对象的请求:

from django.test.client import Client

client = Client()
response = client.get(some_url)
request = response.wsgi_request

或者,如果您使用django.TestCase( from django.test import TestCase, SimpleTestCase, TransactionTestCase),您只需键入以下内容即可访问任何测试用例中的客户端实例self.client

response = self.client.get(some_url)
request = response.wsgi_request
于 2015-09-01T11:49:24.060 回答
12

用于RequestFactory 创建虚拟请求。

于 2012-04-23T09:29:25.543 回答
0

你的意思是def getEvents(request, eid)对吗?

使用 Django unittest,您可以使用from django.test.client import Client发出请求。

见这里:测试客户端

@Secator 的答案是完美的,因为它创建了一个模拟对象,这对于一个非常好的单元测试来说确实是首选。但是根据您的目的,使用 Django 的测试工具可能会更容易。

于 2012-04-23T09:23:17.497 回答
0

您可以使用 django 测试客户端

from django.test import Client
c = Client()
response = c.post('/login/', {'username': 'john', 'password': 'smith'})
response.status_code
response = c.get('/customer/details/')
response.content

有关更多详细信息
https://docs.djangoproject.com/en/1.11/topics/testing/tools/#overview-and-a-quick-example

于 2017-05-11T12:36:39.637 回答