I need to test the methods and helper function inside a django Class Based View.
Consider this Class Based View:
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)
In order to write unit tests for my view, I need to call the methods inside, say __get_render_dict()
directly. How can I achieve this?.
I've tried
v = MyClassedBasedView()
v.dispatch(request,args, kwargs)
v.__method_name()
but this fails with not matching parameters in post/get method, even though I was calling the method direclty without using URL.
To use class based views in your unittests try setup_view
from here .
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
You still need to feed it a request, you can do this with django.test.RequestFactory
:
factory = RequestFactory()
request = factory.get('/customer/details')
You can then unittest your methods:
v = setup_view(MyClassedBasedView(), request)
v.method_name()
我通过执行MyClassedBasedView.as_view()(request)
解决了这个问题
As stated in Sebastian's answer he got the code snippet from django-downloadview docs . In there they state:
This is an early implementation of https://code.djangoproject.com/ticket/20456
A few years later, this feature is now part of Django, as you can read in the docs , so you would just need to do:
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()
The view.setup()
method is precisely what was suggested in the accepted answer, but I think it is better to use the one from Django :)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.