如何在django基于类的视图中单元测试方法?

时间:2015-11-11 07:12:15

标签: python django unit-testing django-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的情况下调用方法direclty。

3 个答案:

答案 0 :(得分:17)

要在您的单元测试中使用基于类的视图,请尝试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()

答案 1 :(得分:5)

更新-在Django 3.0中可用

Sebastian's answer中所述,他从django-downloadview docs获得了代码段。他们在那里声明:

这是https://code.djangoproject.com/ticket/20456

的早期实现

几年后,您可以read in the docs来使用此功能,现在它已成为Django的一部分,因此您只需要执行以下操作:

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的方法:)

答案 2 :(得分:1)

我通过做MyClassedBasedView.as_view()(request)

解决了这个问题