[英]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-downloadview docs獲得了代碼片段。 在那里他們聲明:
幾年后,此功能現已成為 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.