python - 当路由上有多个表单时,如何对表单提交进行单元测试?

标签 python html forms unit-testing flask

我想将单元测试添加到我的 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/

相关文章:

javascript - 使用 jQuery AJAX PHP 的表单不会在电子邮件中发送字段输入

python - 使用 Django ORM 查询基于日期的值

python Fabric不允许我将输出通过管道传输到less?

Python:比较两个 csv 文件中的特定列

javascript - JQuery 插件日期选择器无法按照文档正常工作

html - 仅当元素堆叠时如何设置媒体查询

php - 如何允许只从一个域上传 PHP?

python - 有没有办法使用 python-docx 更改Word文档字体?

html - 无法让 CSS 第 n 项起作用

单击文本时 JavaScript 不提交隐藏表单