【发布时间】:2015-11-24 06:47:21
【问题描述】:
我想向我的烧瓶应用程序添加单元测试,以测试有效和无效登录 + 注册时的表单行为。目前,我在一个页面和路由上托管了注册表单和登录表单,并且正在使用隐藏的输入字段来识别提交/确定下一步操作的两个表单中的哪一个。
我的问题是 - 如何编写针对页面上特定表单的单元测试?到目前为止,我看到的所有示例都将数据发布到特定路线,这就是我目前正在做的事情。但这失败了,因为我需要一种额外的方式来表达“我们正在提交 x 表单”。
那么有没有办法在 post 请求中添加“我们正在提交 x 表单”?
** 编辑添加,这是我尝试在发布数据字典中传递隐藏表单数据的不同方式,但没有成功。
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)
login.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>
【问题讨论】:
-
您需要做两件事之一。您需要在表单中包含具有唯一名称或值的输入,或者按照我推荐的方式,每个表单都应该发布到自己的端点。
标签: python html forms unit-testing flask