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

前端 未结 3 1249
深忆病人
深忆病人 2021-02-07 12:38

I need to test the methods and helper function inside a django Class Based View.

Consider this Class Based View:

class MyClassBasedView(View):

    def d         


        
相关标签:
3条回答
  • 2021-02-07 13:16

    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()
    
    0 讨论(0)
  • 2021-02-07 13:18

    Update - available in Django 3.0

    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 :)

    0 讨论(0)
  • 2021-02-07 13:26

    I solved this issue by doing MyClassedBasedView.as_view()(request)

    0 讨论(0)
提交回复
热议问题