Python Django:测试由url模式触发的基于TemplateView的视图?
假设我有以下urlPython Django:测试由url模式触发的基于TemplateView的视图?,python,django,testing,Python,Django,Testing,假设我有以下url path('clients/by',BrowseClients.as\u view(),name='browse\u clients') 以及相应的视图 @method\u decorator(需要登录,name='dispatch') 类BrowseClient(TemplateView): template_name=“console/browse_clients.html” def获取上下文数据(自身,**kwargs): context=super()。获取上下文数
path('clients/by',BrowseClients.as\u view(),name='browse\u clients')
以及相应的视图
@method\u decorator(需要登录,name='dispatch')
类BrowseClient(TemplateView):
template_name=“console/browse_clients.html”
def获取上下文数据(自身,**kwargs):
context=super()。获取上下文数据(**kwargs)
上下文['clients']=Client.objects.filter(
owner=self.request.user.id).order_by(self.kwargs[“order”])
上下文['form']=AddClientForm()
返回上下文
如何测试上下文中的内容
类TestBrowseClientsView(TestCase,GeneralViewTest):
fixtures=['users.yaml','clients.yaml']
def设置(自):
self.request=RequestFactory()
self.request.user=user.objects.get(pk=1)
def测试返回客户订购日期(自):
view=BrowseClients()
view.setup(self.request)
context=view.get\u context\u data()
我天真地认为,view.setup(self.request)
会根据self.request
中找到的模式,使用相关的kwargs
来“feed”。获取上下文数据()。但事实似乎并非如此
======================================================================
错误:test\u返回\u客户端\u按日期排序\u铭文\u日期(console.tests.TestBrowseClientsView)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“/usr/src/jengu/console/tests.py”,第164行,测试返回客户订购日期
context=view.get\u context\u data()
文件“/usr/src/jengu/console/views.py”,第34行,在get\u context\u数据中
owner=self.request.user.id).order_by(self.kwargs[“order”])
KeyError:“订单”
----------------------------------------------------------------------
为什么会这样?我通过显式地传递状态
和顺序
解决了我的问题,但它看起来有点特别:
def get_context_数据(自身、状态、顺序,**kwargs):
def test_return_clients_ordered_by_参数(self):
view=BrowseClients()
view.setup(self.request)
上下文=视图。获取上下文数据(“全部”、“铭文”)
在这里提到的这些问题中,哪一个更为规范?我是否走错了路,在定义get\u context\u data()
时显式使用了变量?如果您想检查响应上下文中的内容,首先需要使用响应对象(而不是,您只是创建视图的一个实例,而不是获取视图生成的响应)。我不知道RequestFactory
,但我相信您会发现如何根据您的用例调整我的答案
所以,它会是这样的:
def测试您的上下文(self):
user=user.objects.get(pk=1)
self.client.force_login(user)#因为登录需要decorator
response=self.client.get(反向(“浏览客户端”))
assert response.context['your\u context\u key']==“要检查的任何内容”
还有几件事要做:
- 我觉得
get\u context\u data
方法的定义还可以
- 如果您使用基于类的视图,我建议您在检查用户是否登录时也使用基本视图()
- 你给你的url起了个名字,所以用它来代替它的原始形式(这就是我在回答中所做的)
如果要检查响应上下文中的内容,首先需要使用响应对象(而不是,您只是创建视图实例,而不是获取视图生成的响应)。我不知道RequestFactory
,但我相信您会发现如何根据您的用例调整我的答案
所以,它会是这样的:
def测试您的上下文(self):
user=user.objects.get(pk=1)
self.client.force_login(user)#因为登录需要decorator
response=self.client.get(反向(“浏览客户端”))
assert response.context['your\u context\u key']==“要检查的任何内容”
还有几件事要做:
- 我觉得
get\u context\u data
方法的定义还可以
- 如果您使用基于类的视图,我建议您在检查用户是否登录时也使用基本视图()
- 你给你的url起了个名字,所以用它来代替它的原始形式(这就是我在回答中所做的)
如果使用它,将负责运行中间件和初始化视图
当您使用setup()
并直接调用视图时,URL处理程序不会运行,因此由您来传递kwargs
def test_return_client_ordered_by_inscription_date(self):
view = BrowseClients()
view.setup(self.request, order='inscription')
context = view.get_context_data()
如果使用它,将负责运行中间件和初始化视图
当您使用setup()
并直接调用视图时,URL处理程序不会运行,因此由您来传递kwargs
def test_return_client_ordered_by_inscription_date(self):
view = BrowseClients()
view.setup(self.request, order='inscription')
context = view.get_context_data()
不是真正的答案,但您应该通过querystring(即“/console/clients/?by=edinting”)传递排序字段,而不是作为url路径的一部分。不是真正的答案,但您应该通过querystring(即“/console/clients/?by=edintinting”)传递排序字段,而不是作为url路径的一部分。