如何在基于 Django class 的视图中对方法进行单元测试?
How to unit test methods inside django's class based views?
我需要在基于 django Class 的视图中测试方法和辅助函数。
考虑这个 Class 基于视图:
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.
的情况下直接调用该方法
要在单元测试中使用基于 class 的视图,请尝试 here 中的 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 中可用
如 he got the code snippet from django-downloadview docs所述。他们在那里说:
This is an early implementation of https://code.djangoproject.com/ticket/20456
几年后,此功能现已成为 Django 的一部分,您可以 read in the 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 中的方法 :)
我需要在基于 django Class 的视图中测试方法和辅助函数。
考虑这个 Class 基于视图:
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.
的情况下直接调用该方法要在单元测试中使用基于 class 的视图,请尝试 here 中的 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 中可用
如
This is an early implementation of https://code.djangoproject.com/ticket/20456
几年后,此功能现已成为 Django 的一部分,您可以 read in the 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 中的方法 :)