Django测试RequestFactory vs Client

t.p*_*tel 44 django unit-testing django-views django-testing django-rest-framework

我试图决定是否应该使用Django ClientRequestFactory测试我的观点.

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

什么是Django的测试之间的差异Client以及RequestFactory和哪种方法更适合用于测试REST服务器(如果有喜欢,除了一个较好的有什么区别)?

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

knb*_*nbk 63

RequestFactoryClient有一些非常不同的用例.把它放在一个句子里:RequestFactory返回a request,同时Client返回a response.

RequestFactory就是它所说的 - 它是一个创建request对象的工厂.没有更多,没有更少.

Client用于假一个完整的请求-响应周期.它将创建一个request对象,然后通过WSGI处理程序.此处理程序解析url,调用适当的中间件并运行视图.然后它返回响应对象.它具有额外的好处,它收集了response对象的大量额外数据,这对测试非常有用.

RequestFactory实际上并没有触及任何代码的,但request对象可以用来测试需要一个有效的代码的部分request.在Client运行您的看法,所以为了测试你的意见,你需要使用Client和检查响应.一定要检查出的文件Client.

  • 如果你要创建类似于内置[`AuthenticationForm`]的东西(https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm),它将`request`对象作为其第一个参数,您将使用`RequestFactory`来测试它. (8认同)
  • 我不认为使用`Client`来测试视图是绝对必要的.我见过使用`RequestFactory`创建`request`然后调用`SomeView.as_view()(request)`以获取响应的代码.但我来到这里是因为我不确定这是最好的方法.另一个问题的人说`Client`更适用于集成测试:http://stackoverflow.com/questions/5777447/test-django-views-that-require-login-using-requestfactory?rq=1 (8认同)
  • 如果您是View类的单元测试,则使用Request Factory,但是如果您想测试整个请求/响应周期,则可以使用Client. (7认同)
  • 谢谢你的回答。你能给我举个例子,说明工厂更适合用于测试吗? (2认同)