我正在尝试决定是否应该使用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服务器(如果除了更喜欢之外还有什么区别)?< / p>
我应该用两者创建测试,以便为我的系统提供更好的覆盖吗?
答案 0 :(得分:57)
RequestFactory
和Client
有一些非常不同的用例。将它放在一个句子中: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返回的响应时,将使用客户端。