Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:测试由url模式触发的基于TemplateView的视图?_Python_Django_Testing - Fatal编程技术网

Python Django:测试由url模式触发的基于TemplateView的视图?

Python 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()。获取上下文数

假设我有以下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()。获取上下文数据(**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路径的一部分。