如何在 Django 中测试具有表单的视图?

Posted

技术标签:

【中文标题】如何在 Django 中测试具有表单的视图?【英文标题】:How can I test in Django a view which has a form? 【发布时间】:2015-11-06 14:32:19 【问题描述】:

我正在 Django 中创建一个应用程序,并且我有一个视图,它从 html 代码接收一个表单,并在数据库中搜索是否有任何具有表单中指定值的模型实例。

问题是我是 Django 的新手,我真的不知道如何测试视图的功能(即:如果视图的响应有一个值列表,则导致在请求)。

这里放我视图的示例代码:

@login_required
def view(request):

# If it's a HTTP POST, we're interested in processing form data.
if request.method == 'POST':

    form = Form(data=request.POST)

    # If the form is valid
    if (form.is_valid()):

        resulting_of_search = ModelA.objects.filter(Q(att1=request.POST[attr1]) & ...)



    else:
        resulting_of_search = []


# Not a HTTP POST, so we render our form using two ModelForm instances.
# These forms will be blank, ready for user input.
else:
    form = Form()
    resulting_of_search= []



# Render the template depending on the context.
return render(request,
        'url/url.html',
        'resulting':resulting_of_search )

【问题讨论】:

【参考方案1】:

你试过Django Testing Tutorial吗?本质上,您只需向您的视图发送一个帖子并测试响应是否返回您所期望的。

例如..

def test_index_view_with_no_questions(self):
    """
    If no questions exist, an appropriate message should be displayed.
    """
    response = self.client.get(reverse('polls:index'))
    self.assertEqual(response.status_code, 200)
    self.assertContains(response, "No polls are available.")
    self.assertQuerysetEqual(response.context['latest_question_list'], [])

取自文档。您想更改最后一行,以便断言“结果”在上下文中。或者检查它是否包含您要查找的特定结果列表。像这样..

def test_results(self):
    response = self.client.get(reverse('ensaioak_bilatu'))
    self.assertQuerySetEqual(response.context['resulting'], [...whatever you expect resulting to contain...])

【讨论】:

我做了,但我的问题是:如果我在视图末尾有“返回渲染”,我该如何测试视图的结果? 那句“reverse('polls:index')”是什么意思? Reverse 是一个实用函数,可用于从您在 urls 文件中指定的名称中获取视图。文档在这里docs.djangoproject.com/en/1.8/ref/urlresolvers/… 最佳实践是使用 reverse 允许您只更改一次 URL(在 urls 文件中),而不是在您在代码中使用它的任何地方(包括在您的测试中)。但是,您仍然可以在没有它的情况下工作,只需说 self.client.get('无论您的视图的路径是什么'])。【参考方案2】:

通过阅读您的回答,我认为您不是在询问单元测试,而只是检查您的观点是否真正有效。首先,您可以使用 Django 网站上提供的代码 sn-p,链接如下:https://docs.djangoproject.com/en/1.8/topics/forms/#the-view。

【讨论】:

以上是关于如何在 Django 中测试具有表单的视图?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在 Django 中为表单编写测试?

如何在Django的视图功能中访问Django模板中表单中的复选框[关闭]

如何在 django 的一个视图中使用多个表单

如何使用基于类的视图在同一模板中使用两个不同的 Django 表单

如何在带有上下文的 Django 中重定向?

如何在不通过视图在所有页面中发送表单的情况下从 django 布局(如“base.html”)获取表单数据?