pythondjangounit-testingdjango-class-based-views

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


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.


Solution

  • 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()