如何通过django-webtest

时间:2015-09-04 04:44:08

标签: django forms django-webtest

我使用django-webtest自动化Django应用程序的功能测试。我的一个ModelForms有多个提交按钮。使用django-crispy-forms的模板看起来像这样:

<form action="" method="post">
{% csrf_token %}
<p>
    {{ person_form|crispy }}
    <br><br>
    {{ admin_form|crispy }}
</p>
<button id="SaveButton" type="submit" name="save_data" class="btn btn-lg btn-primary">Save</button>
<button id="VerifyButton" type="submit" name="verify_data" class="btn btn-lg btn-primary">Verify</button>
</form>

当我通过点击“保存”按钮从网页手动提交表单时,传递到相应视图方法的request.POST包含&#39; save_data&#39;我用来决定在代码中做什么的标记。

然而,当我创建一个django-webtest测试用例来做同样的事情时,&#39; save_data&#39;标签不存在,即使我在form.submit()中指定它,如下所示:

def test_schools_app_access_school_admin_record(self):

    school_index = self.app.get(reverse('schools:school_index'), 
                                user=self.school_admin)
    assert self.school_name in school_index    
    school_page = school_index.click(self.school_name)
    assert 'View School Administrator' in school_page

    school_admin_page = school_page.click('View School Administrator')

    person_form = school_admin_page.forms[1]   

    assert person_form['person-name'].value == self.school_admin_name

    # TODO: Figure out how to pass name='save_data' while submitting
    person_form['person-email'] = self.school_admin_email
    response = person_form.submit(name='save_data', value='save')

    # Verify that the field has been updated in the database
    person = Person.objects.get(name=self.school_admin_name)
    assert self.school_admin_email in person.email 

如何让django-webtest在request.POST中包含提交按钮的名称?

另外,由于我在同一页面上有多个表单,我目前正在使用response.forms [1]来选择感兴趣的表单。但我想改用表单id。我无法在Django文档中找到如何将表单id(不是字段id)分配给ModelForm。有人可以帮我这个吗?

我使用的是Django 1.7,django-webtest 1.7.8,WebTest 2.0.18和django-crispy-forms 1.4.0。

1 个答案:

答案 0 :(得分:0)

我发现我在我的代码段中输入了一个拼写错误,因为我的代码无效。

在这个片段中

person_form['person-email'] = self.school_admin_email
response = person_form.submit(name='save_data', value='save')

我应该有值='保存'而不是'保存'。 经过更正后,响应确实包含名称“save_data”。