tot*_*oro 11 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)
Run Code Online (Sandbox Code Playgroud)
为了为我的视图编写单元测试,我需要调用里面的方法,__get_render_dict()直接说.我怎么能实现这个目标?
我试过了
v = MyClassedBasedView()
v.dispatch(request,args, kwargs)
v.__method_name()
Run Code Online (Sandbox Code Playgroud)
但是在post/get方法中没有匹配的参数失败了,即使我在不使用URL的情况下调用方法direclty.
Seb*_*zny 19
要在您的单元测试中使用基于类的视图,请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
Run Code Online (Sandbox Code Playgroud)
您仍需要向其提供请求,您可以执行以下操作django.test.RequestFactory:
factory = RequestFactory()
request = factory.get('/customer/details')
Run Code Online (Sandbox Code Playgroud)
然后,您可以对方法进行单元测试:
v = setup_view(MyClassedBasedView(), request)
v.method_name()
Run Code Online (Sandbox Code Playgroud)
正如塞巴斯蒂安的回答中所述,他从django-downloadview docs获得了代码片段。在那里他们声明:
几年后,此功能现已成为 Django 的一部分,您可以在 docs 中阅读,因此您只需要执行以下操作:
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()
Run Code Online (Sandbox Code Playgroud)
该view.setup()方法正是接受的答案中建议的方法,但我认为最好使用 Django 中的方法 :)