Python wtforms上的单元测试失败

Python wtforms上的单元测试失败,python,python-unittest,flask-wtforms,wtforms,Python,Python Unittest,Flask Wtforms,Wtforms,当使用pytest对向表单发布数据进行单元测试时,表单的filed数据总是',这似乎是数据没有正确地“发布”到表单,这会导致表单。提交时验证()将始终返回False。我在测试时禁用了WTF\u CSRF\u ENABLED 我做了一个小项目来演示这个问题。我并没有在这里包括数据库,因为数据库在我的实际项目中运行良好 此最小项目结构如下所示: . ├── app.py ├── templates │ └── login.html └── tests └── test_login.py

当使用pytest对向表单发布数据进行单元测试时,表单的filed数据总是
'
,这似乎是数据没有正确地“发布”到表单,这会导致
表单。提交时验证()
将始终返回
False
。我在测试时禁用了
WTF\u CSRF\u ENABLED

我做了一个小项目来演示这个问题。我并没有在这里包括数据库,因为数据库在我的实际项目中运行良好

此最小项目结构如下所示:

.
├── app.py
├── templates
│   └── login.html
└── tests
    └── test_login.py
test_login.py:

导入单元测试
从flask导入当前应用程序
从应用程序导入创建应用程序
类BasicTestCase(unittest.TestCase):
def设置(自):
self.app=create_app()
self.app.config['WTF\u CSRF\u ENABLED']=False
self.app\u context=self.app.app\u context()
self.app_context.push()
self.client=self.app.test_client()
def拆卸(自):
self.app_context.pop()
def测试应用程序存在(自身):
self.assertFalse(当前应用程序为无)
def测试主页(自):
response=self.client.get(“/”)
self.assertEqual(response.status_代码,200)
def测试_登录(自我):
响应=self.client.post(
“/login”,数据={
“用户名”:“a”,
“密码”:“a”
})
app.py:

从烧瓶导入烧瓶、重定向、呈现模板、url、蓝图
来自flask_wtf进口FlaskForm
从wtforms导入PasswordField、StringField、SubmitField
从wtforms.validators导入所需数据,长度
bp=蓝图('myapp',名称)
@bp.route(“/”)
def home():
返回“你好”
@路由('/login',方法=['GET',POST'])
def login():
form=LoginForm(前缀='form-login-')
if form.validate_on_submit():
返回重定向(url_for('home'))
返回呈现模板('login.html',form=form)
类别登录表单(烧瓶表单):
username=StringField('username',验证器=[DataRequired()])
password=PasswordField('password',验证器=[DataRequired()])
submit=SubmitField('登录')
def create_app():
app=烧瓶(“名称”)
app.config['SECRET_KEY']='secretkey'
应用程序注册蓝图(bp)
返回应用程序

事实证明,当wtforms具有
prefix
属性时,发布数据的方式应该会改变

如您所见,我使用的表单是
form=LoginForm(prefix='form-login-')
,我将数据发布到表单的方式是

response=self.client.post(
“/login”,数据={
“用户名”:“a”,
“密码”:“a”
})
在将表单中使用的
前缀添加到数据字典之前,它不会正确传递数据,如下所示:

response=self.client.post(
“/login”,数据={
“表单登录用户名”:“a”,
“表单登录密码”:“a”
})
现在一切都好了


但是,如果要获取表单字段数据,仍然应该使用
form.username.data
,而不使用任何
前缀

,事实证明,当wtforms具有
前缀
属性时,发布数据的方式应该改变

如您所见,我使用的表单是
form=LoginForm(prefix='form-login-')
,我将数据发布到表单的方式是

response=self.client.post(
“/login”,数据={
“用户名”:“a”,
“密码”:“a”
})
在将表单中使用的
前缀添加到数据字典之前,它不会正确传递数据,如下所示:

response=self.client.post(
“/login”,数据={
“表单登录用户名”:“a”,
“表单登录密码”:“a”
})
现在一切都好了

但是,如果要获取表单字段数据,仍然应该使用
form.username.data
,而不使用任何
前缀