Django测试RequestFactory vs Client

时间:2015-06-23 01:21:12

标签: django unit-testing django-views django-rest-framework django-testing

我正在尝试决定是否应该使用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)

使用Django&#39; ClientRequestFactory进行测试之间有什么区别?哪种方法更适合测试REST服务器(如果除了更喜欢之外还有什么区别)?< / p>

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

2 个答案:

答案 0 :(得分:57)

RequestFactoryClient有一些非常不同的用例。将它放在一个句子中:RequestFactory返回request,而Client返回response

RequestFactory执行它所说的内容 - 它是创建request个对象的工厂。没什么,没什么。

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

RequestFactory实际上并没有触及您的任何代码,但request对象可用于测试需要有效request的代码部分。 Client会运行您的观看次数,因此,为了测试您的观看次数,您需要使用Client并检查回复。务必查看Client上的the documentation

答案 1 :(得分:0)

使用Django REST框架时,请求工厂将有助于测试权限。

EX:

Class TestPermission(TestCase):
  
    def test_admin_permisiion(self):
        admin_user = User.objects.create(email='admin@gmail.com',password='admin997',is_staff=True)
        factory = RequestFactory()
        request = factory.get('/')
        request.user = admin_user
        permission = IsAdminUser()
        has_permission = permission.has_permission(request, None)
        self.assertTrue(has_permission)

我们所听到的是我们通过设置is_staff = True创建了一个admin用户,然后我们创建了一个请求并将admin分配为该请求的用户。请求工厂可以帮助我们做到这一点。然后我们根据请求检查了DRF的IsAdminUser()权限。测试将通过。

当您需要测试Api返回的响应时,将使用客户端。