Django 测试 RequestFactory 与 Client
Django test RequestFactory vs Client
我正在考虑是否应该使用 Django 的 Client
或 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 的 Client
和 RequestFactory
进行测试有什么区别,哪种方法更适合测试 REST 服务器(如果除了更喜欢一个更好之外还有什么区别)?
我应该同时创建测试以便为我的系统提供更好的覆盖率吗?
RequestFactory
和 Client
有一些非常不同的用例。一句话概括就是:RequestFactory
returns一个request
,而Client
returns一个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 返回的响应时,将使用客户端。
我正在考虑是否应该使用 Django 的 Client
或 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 的 Client
和 RequestFactory
进行测试有什么区别,哪种方法更适合测试 REST 服务器(如果除了更喜欢一个更好之外还有什么区别)?
我应该同时创建测试以便为我的系统提供更好的覆盖率吗?
RequestFactory
和 Client
有一些非常不同的用例。一句话概括就是:RequestFactory
returns一个request
,而Client
returns一个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 返回的响应时,将使用客户端。