26

我想确定是否应该使用Django的ClientRequestFactory来测试我的视图。Django测试RequestFactory与客户端

我使用DjangoRESTFramework创建我的服务器,它真的很简单,到目前为止:

class SimpleModelList(generics.ListCreateAPIView): 
    """ 
    Retrieve list of all route_areas or create a new one. 
    """ 
    queryset = SimpleModel.objects.all() 
    serializer_class = SimpleModelSerializer 
    filter_backends = (IsOwnerFilterBackend,) 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) 

什么是Django的ClientRequestFactory和哪种方法更适合用于测试REST服务器测试之间的差异(如除了喜欢更好的之外,还有什么不同)?

我应该为两者创建测试以便为我的系统提供更好的覆盖范围吗?

回答

40

RequestFactoryClient有一些非常不同的用例。用一句话说:RequestFactory返回request,而Client返回response

RequestFactory做了什么 - 它是一个工厂,创建request对象。没有更多,没有更多。

Client用于伪造完整的请求 - 响应循环。它将创建一个request对象,然后它将通过WSGI处理程序。该处理程序解析url,调用相应的中间件,并运行视图。然后它返回响应对象。它具有额外的好处,它收集了对测试极其有用的response对象上的大量额外数据。

RequestFactory实际上并未碰到任何代码,但request对象可用于测试代码中需要有效request的部分代码。 Client运行您的观点,因此为了测试您的观点,您需要使用Client并检查响应。请务必在Client上查看the documentation

+0

谢谢你的回答。你能举一个例子,说明一个工厂更适合用于测试吗? –

+5

如果您要创建类似于内置['AuthenticationForm'](https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm)的东西, ,它将'request'对象作为第一个参数,您可以使用'RequestFactory'来测试它。 – knbk

+4

我不认为使用'客户端'来测试视图是绝对必要的。我见过使用RequestFactory创建'request'的代码,然后调用'SomeView.as_view()(request)'来获得响应。但是我来到这里是因为我不确定那是做这件事的最好方式。在另一个问题的人说'客户端'更集成测试:http://stackoverflow.com/questions/5777447/test-django-views-that-require-login-using-requestfactory?rq=1 – Andy