簡體   English   中英

如何在 django 基於類的視圖中對方法進行單元測試?

[英]How to unit test methods inside django's class based views?

我需要在基於 django 類的視圖中測試方法和輔助函數。

考慮這個基於類的視圖:

class MyClassBasedView(View):

    def dispatch(self, request, *args, **kwargs):
        ....

    def __get_render_dict():
        d = {}
        ...
        return d

    def my_method(self):
        render_dict =  self.__get_render_dict()
        return render_response(self.request, 'template.html', render_dict)

為了為我的視圖編寫單元測試,我需要調用里面的方法,直接說__get_render_dict() 我怎樣才能做到這一點?

我試過了

v = MyClassedBasedView() 
v.dispatch(request,args, kwargs)
v.__method_name()

但這會因 post/get 方法中的參數不匹配而失敗,即使我在不​​使用 URL 的情況下直接調用方法。

要在單元測試中使用基於類的視圖,請嘗試setup_view這里

def setup_view(view, request, *args, **kwargs):
    """
    Mimic ``as_view()``, but returns view instance.
    Use this function to get view instances on which you can run unit tests,
    by testing specific methods.
    """

    view.request = request
    view.args = args
    view.kwargs = kwargs
    return view

你仍然需要給它一個請求,你可以用django.test.RequestFactory做到這一點:

    factory = RequestFactory()
    request = factory.get('/customer/details')

然后,您可以對您的方法進行單元測試:

v = setup_view(MyClassedBasedView(), request) 
v.method_name()

我通過執行MyClassedBasedView.as_view()(request)解決了這個問題

更新 - 在 Django 3.0 中可用

正如塞巴斯蒂安的回答中所述,他從django-downloadview docs獲得了代碼片段。 在那里他們聲明:

這是https://code.djangoproject.com/ticket/20456的早期實現

幾年后,此功能現已成為 Django 的一部分,您可以在 docs 中閱讀,因此您只需要執行以下操作:

from django.test import RequestFactory, TestCase
from .views import MyClassBasedView

class MyClassBasedViewTest(TestCase):
  def test_my_method(self):
    request = RequestFactory().get('/')
    view = MyClassBasedView()
    view.setup(request)

    view.my_method()

view.setup()方法正是接受的答案中建議的方法,但我認為最好使用 Django 中的方法 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM