【发布时间】:2019-05-22 01:46:32
【问题描述】:
我使用flask-wtf 编写了一些使用FieldList 和FormField 的表单,我想使用pytest 测试它们。这是从上传的 CSV 批量插入数据
这些是我的表格:
# myapp/admin/forms.py
from wtforms import Form as NoCsrfForm
class SimpleRegistrationForm(NoCsrfForm):
email = StringField('Email')
username = StringField('Username')
password = StringField('Password')
from flask_wtf import FlaskForm
class BulkUserCreationForm(FlaskForm):
users = FieldList(FormField(SimpleRegistrationForm))
submitted = HiddenField()
submit = SubmitField('Register all')
def is_submitted(self):
from flask import request
return super().is_submitted() and 'submitted' in request.form
请注意,我跳过了导入和其他内容。另外,我使用submitted 阻止我的@app.route 通过validate_on_submit()。
这是我测试的部分:
# a part of a test
# (...) mumble mumble
from myapp.admin.forms import (
BulkUserCreationForm, SimpleRegistrationForm)
usr_form_1 = SimpleRegistrationForm(username="user1",
email="user1@mail.com",
password="pwd1",)
usr_form_2 = SimpleRegistrationForm(username="user2",
email="user2@mail.com",
password="pwd2",)
usr_form_full = BulkUserCreationForm(
users=[usr_form_1, usr_form_2])
# user issues a POST request
rv = client.post(
url_for('bulk-import-users.edit_users')
follow_redirects=True,
data=usr_form_full.data)
assert something_happened()
我正在努力研究如何制作 post() 的 data 参数。到目前为止,我已经阅读了三种方法
-
This solution 使用数据作为元组,但我不了解元组和表单之间的绑定,例如
BulkUserCreationForm.users -
This solution 依赖于表单实例的
usr_form_full.data,它返回一个字典。在提到的 SO 答案中,它似乎有效,但在我的情况下(以及我展示的代码),我收到了以下形式的错误:/src/venv/lib/python3.6/site-packages/werkzeug/test.py:349: DeprecationWarning: it's no longer possible to pass dicts as `data`. Use tuples or FileStorage objects instead -
谷歌搜索此错误returned this(仅此而已)。这个解决方案使用硬编码值,所以我选择了一些(我相信)或多或少更好的东西:
data_full = {field.label.field_id: field.data for form in usr_form_full.users for field in form}
并将其传递给data 属性。它没有用。由于某种原因,呈现的.data 属性的行为与预期不同,返回了不同的repr(我希望看到实际的值)。
>>> print(data_full)
{'users-0-email': <wtforms.fields.core.StringField object at 0x7f1704f68cc0>, 'users-0-username': <wtforms.fields.core.StringField object at 0x7f1704fa5e10>, 'users-0-password': <wtforms.fields.core.StringField object at 0x7f1704f539e8>, 'users-1-email': <wtforms.fields.core.StringField object at 0x7f1704f26a90>, 'users-1-username': <wtforms.fields.core.StringField object at 0x7f1704f26f98>, 'users-1-password': <wtforms.fields.core.StringField object at 0x7f1704f26828>}
简而言之,以上方法在我的测试中均无效。什么是正确的方法?我还需要将submit 和submitted 值传递给我的表单实例吗?
【问题讨论】:
标签: python testing flask flask-wtforms wtforms