我想将单元测试添加到我的 Flask 应用程序中,以测试表单在有效和无效登录 + 注册时的行为。目前,我在一个页面和路由上托管了一个注册表单和一个登录表单,并且正在使用一个隐藏的输入字段来识别提交了这两个表单中的哪一个/确定下一步的操作。
我的问题是 - 如何编写针对页面上特定表单的单元测试?到目前为止我看到的所有示例都将数据发布到特定路线,这就是我目前正在做的事情。但这是失败的,因为我需要一种额外的方式来表示“我们正在提交 x 表单”。
那么有没有办法在post请求中添加“and we're submitting x form”?
** 编辑添加,这是我尝试在发布数据字典中传递隐藏表单数据的不同方式,但没有成功。
data = dict(username="test@gmail.com", password="test", login_form)
data = dict(username="test@gmail.com", password="test", "login_form")
data = dict(username="test@gmail.com", password="test", login_form=True)
登录单元测试:
from app import app
import unittest
class FlaskTestCase(unittest.TestCase):
#ensure that login works with correct credentials
def test_correct_login(self):
tester = app.test_client(self)
response = tester.post(
'/login',
data = dict(username="test@gmail.com", password="test"),
follow_redirects=True
)
self.assertIn(b'you are logged in', response.data)
views.py 中的登录路径:
@app.route('/login', methods=['POST', 'GET'])
def login():
login_form = LoginForm()
signup_form = SignupForm()
error_login = ''
error_signup = ''
#login form
if 'login_form' in request.form and login_form.validate():
# do login form stuff
#signup form
if 'signup_form' in request.form and signup_form.validate():
# do signup form stuff
return render_template('login.html', login_form=login_form, signup_form=signup_form, error=error)
登录.html:
<div class="login-form form-400">
<h3>Log In To Your Account</h3>
<form action="" method="post">
<input type="hidden" name="login_form">
{% if error_login != '' %}
<label class="error">
{{ error_login }}
</label>
{% endif %}
{% from "_formhelper.html" import render_field %}
{{ login_form.hidden_tag() }}
{{ render_field(login_form.email, placeholder="Your Email", class="form-item__full", type="email") }}
{{ render_field(login_form.password, placeholder="Your Password", class="form-item__full") }}
<input type="submit" value="Login" class="button button-blue">
</form>
</div>
<p class="login-divider">or</p>
<div class="signup-form form-400">
<h3>Create a New Account</h3>
<form action="" method="post">
<input type="hidden" name="signup_form">
{% if error_signup != '' %}
<label class="error">
{{ error_signup | safe}}
</label>
{% endif %}
{% from "_formhelper.html" import render_field %}
{{ signup_form.hidden_tag() }}
{{ render_field(signup_form.username, placeholder="Pick a Username", class="form-item__full") }}
{{ render_field(signup_form.email, placeholder="Your Email", class="form-item__full", type="email") }}
{{ render_field(signup_form.password, placeholder="Create a Password", class="form-item__full") }}
<input type="submit" value="Sign Up" class="button button-green">
</form>
</div>
最佳答案
好吧,我明白了。要传递 login_form 信息,我不得不像这样在 login_form 上传递一个空字符串:
def test_correct_login(self):
tester = app.test_client(self)
response = tester.post(
'/login',
data = dict(username="test@gmail.com", password="test", login_form=""),
follow_redirects=True
)
self.assertIn(b'you are logged in', response.data)
我通过在我的 views.py 中为这条路线抛出一个 print request.form
来做到这一点,然后看到空字符串。
它仍然失败,但因为 login_form.validate()
由于 WTForms 模块添加的 csrf token 而失败。最终,这场讨论有了答案。
Flask-WTF / WTForms with Unittest fails validation, but works without Unittest
感谢@drdrez 的建议!
关于python - 当路由上有多个表单时,如何对表单提交进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32290830/