gpt4 book ai didi

python - 测试使用 `FieldList` 和 `FormField` 的 Flask-WTF 表单

转载 作者:行者123 更新时间:2023-12-03 21:16:10 24 4
gpt4 key购买 nike

我使用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()

我正在为如何制作 data 而苦苦挣扎 post() 的论点.到目前为止,我已经阅读了三种方法
  • This solution使用数据作为元组,但我不理解元组和表单之间的绑定(bind),例如 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>}

    简而言之,以上方法都没有在我的测试中起作用。什么是正确的方法?我需要通过 submitsubmitted我的表单实例的值呢?

    最佳答案

    就我而言,我想测试传递给我的表单的参数是否传递给下游函数。

        form = MyForm()
    if form.validate_on_submit():
    args = unpack_form(form)
    do_something(args)
    我在模拟嵌套的 FormField 值时遇到了同样的问题,所以我想出的解决方案是提供一个数据字典,其中键是表单的字段。如果字段是 FormField,则在父字段名称和嵌套表单字段名称之间添加破折号:
    {"parent_form_field-nested_form_field" : "value"}
    例如测试这个
    class ContactDetailsForm(FlaskForm):
    phone_number = StringField("Phone number")
    email = StringField("Email")


    class UserForm(FlaskForm):
    name = StringField("Name")
    work_contact = FormField(ContactDetailsForm)
    home_contact = FormField(ContactDetailsForm)
    编写以下模拟
    def test_user_form(app):
    data = {
    "name": "John",
    "work_contact-phone_number": "1234",
    "work_contact-email": "john@work.com",
    "home_contact-phone_number": "5678",
    "home_contact-email": "john@home.com"
    }
    app.post("/user_form", data=data)

    关于python - 测试使用 `FieldList` 和 `FormField` 的 Flask-WTF 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53887291/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com