Django 测试 RequestFactory 与 Client

Django test RequestFactory vs Client

我正在考虑是否应该使用 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 的 ClientRequestFactory 进行测试有什么区别,哪种方法更适合测试 REST 服务器(如果除了更喜欢一个更好之外还有什么区别)?

我应该同时创建测试以便为我的系统提供更好的覆盖率吗?

RequestFactoryClient 有一些非常不同的用例。一句话概括就是:RequestFactoryreturns一个request,而Clientreturns一个response

RequestFactory 就像它所说的那样 - 它是一个创建 request 对象的工厂。不多也不少。

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

RequestFactory 实际上不会触及您的任何代码,但 request 对象可用于测试需要有效 request 的代码部分。 Client 运行您的视图,因此为了测试您的视图,您需要使用 Client 并检查响应。请务必查看 Client 上的 the documentation

当使用 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 创建了一个管理员用户,然后我们创建了一个请求并将管理员指定为请求的用户。请求工厂帮助我们这样做。然后我们根据请求检查了 DRF 的 IsAdminUser() 权限。测试将通过。

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