Django测试:RequestFactory与Client对比

82

我正在考虑是否应该使用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的Client和RequestFactory进行测试的区别,哪种方法更适合测试REST服务器(除了更喜欢其中一种方法外还有什么区别)?
我是否应该同时使用两种方法来提供更好的系统覆盖率?
2个回答

133

RequestFactoryClient 有着非常不同的用途。简而言之:RequestFactory 返回一个 request,而 Client 返回一个 response

RequestFactory 执行它的名字所说的- 它是一个工厂,用于创建 request 对象。仅此而已。

Client 用于模拟完整的请求-响应循环。它将创建一个 request 对象,然后通过 WSGI 处理程序传递它。这个处理程序解析 url,调用适当的中间件,并运行视图。然后返回响应对象。它还有一个附加好处,就是收集了许多有用于测试的关于 response 对象的额外数据。

RequestFactory 实际上并没有触及任何你的代码,但是 request 对象可以用于测试需要有效 request 的部分代码。Client 运行你的视图,因此为了测试你的视图,你需要使用 Client 并检查响应。请务必查看关于 Client文档


3
谢谢您的回答。您能给我一个例子,说明在测试中使用工厂会更加合适吗? - t.pimentel
10
如果你想创建类似于内置的AuthenticationForm的东西,它以一个request对象作为其第一个参数,那么你可以使用RequestFactory来测试它。 - knbk
12
我认为在测试视图时并不一定需要使用 Client。我看过一些用 RequestFactory 创建 request,然后调用 SomeView.as_view()(request) 来获取响应的代码。但我来这里是因为我不确定这是否是最好的方法。另一个问题中的人说 Client 更适合集成测试:https://dev59.com/Q2025IYBdhLWcg3w1JeG?rq=1 - Andy
12
如果您正在对View类进行单元测试,您将使用Request Factory,但如果您想测试整个请求/响应周期,例如,您将使用Client。 - aphenine

4
当使用Django REST框架时,请求工厂将有助于测试权限。
示例:
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返回的响应时,应使用Client。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接