Python 如何在django'中使用单元测试方法;s基于类的视图?

Python 如何在django'中使用单元测试方法;s基于类的视图?,python,django,unit-testing,django-class-based-views,Python,Django,Unit Testing,Django Class Based Views,我需要在基于django类的视图中测试方法和helper函数 考虑这种基于类的视图: class MyClassBasedView(View): def dispatch(self, request, *args, **kwargs): .... def __get_render_dict(): d = {} ... return d def my_method(self): rende

我需要在基于django类的视图中测试方法和helper函数

考虑这种基于类的视图:

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)
为了为我的视图编写单元测试,我需要调用其中的方法,比如直接调用
\uu get\u render\u dict()
。我怎样才能做到这一点

我试过了

v = MyClassedBasedView() 
v.dispatch(request,args, kwargs)
v.__method_name()

但是,如果post/get方法中的参数不匹配,则此操作将失败,即使我在不使用URL的情况下直接调用该方法。

要在单元测试中使用基于类的视图,请尝试从中选择
设置视图

您仍然需要向其提供请求,您可以通过以下方式完成此操作:

然后,您可以测试您的方法:

v = setup_view(MyClassedBasedView(), request) 
v.method_name()

我通过执行
MyClassedBasedView.as_view()(请求)

更新解决了这个问题-可在Django 3.0中获得 如中所述,他从中获得了代码片段。他们在信中说:

这是一个早期的实施

几年后,此功能现在已成为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的方法:)

你说的
中的方法是什么意思。。。为什么要直接实例化CBV(并分派)?Django为您这样做,只需在
urls.py
中插入视图作为
url(r'whateverpattern$,MyClassBasedView.as_view(),name='viewname'),
,并且,请正确缩进您的代码,以确保我们都理解相同的内容。我的回答解决了您的问题吗?如果是,请接受,如果不是,请说明您的问题。是的,我在单元测试中使用了这个。但是,我确实希望调用未映射到任何URL的特定帮助器函数:比如说
/customer/details
调用func1,它调用了帮助器1。如何调用helper1?
setup\u view
返回视图对象。然后可以调用
Myview.helper(*args)
,即使传递的url没有调用它
setup\u view
不会调用
dispatch
。感谢您的更新!我还能打电话给调度吗?因为它添加了一些变量,即所有其他方法都会使用的
self.foo
。如果您想调用不同的方法,您正在编写集成测试。如果您想对助手方法进行单元测试,只需自己添加变量。:
v.foo=5
只需使用
v.helper\u方法()
\u
将此方法标记为魔术。有关解释,请参阅。如果我尝试查看.get(),将抛出错误
TypeError:get()缺少1个必需的位置参数:“request”
。大多数视图方法(如果不是所有视图方法的话)不都将请求作为参数吗?这是正确的。唯一需要注意的是,从URL模式提取的任何变量都不是自动完成的,因此需要在调用中手动指定这些参数。因此,如果您的URL模式捕获了“”,那么您可以调用如下视图:
MyClassedBasedView.as\u view()(request,slug=“some slug”)
v = setup_view(MyClassedBasedView(), request) 
v.method_name()
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()