26

我想確定是否應該使用Django的ClientRequestFactory來測試我的視圖。Django測試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的ClientRequestFactory和哪種方法更適合用於測試REST服務器測試之間的差異(如除了喜歡更好的之外,還有什麼不同)?

我應該爲兩者創建測試以便爲我的系統提供更好的覆蓋範圍嗎?

回答

40

RequestFactoryClient有一些非常不同的用例。用一句話說:RequestFactory返回request,而Client返回response

RequestFactory做了什麼 - 它是一個工廠,創建request對象。沒有更多,沒有更多。

Client用於僞造完整的請求 - 響應循環。它將創建一個request對象,然後它將通過WSGI處理程序。該處理程序解析url,調用相應的中間件,並運行視圖。然後它返回響應對象。它具有額外的好處,它收集了對測試極其有用的response對象上的大量額外數據。

RequestFactory實際上並未碰到任何代碼,但request對象可用於測試代碼中需要有效request的部分代碼。 Client運行您的觀點,因此爲了測試您的觀點,您需要使用Client並檢查響應。請務必在Client上查看the documentation

+0

謝謝你的回答。你能舉一個例子,說明一個工廠更適合用於測試嗎? –

+5

如果您要創建類似於內置['AuthenticationForm'](https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm)的東西, ,它將'request'對象作爲第一個參數,您可以使用'RequestFactory'來測試它。 – knbk

+4

我不認爲使用'客戶端'來測試視圖是絕對必要的。我見過使用RequestFactory創建'request'的代碼,然後調用'SomeView.as_view()(request)'來獲得響應。但是我來到這裏是因爲我不確定那是做這件事的最好方式。在另一個問題的人說'客戶端'更集成測試:http://stackoverflow.com/questions/5777447/test-django-views-that-require-login-using-requestfactory?rq=1 – Andy