Python 如何使用Flask中的表单在视图上测试POST操作

Python 如何使用Flask中的表单在视图上测试POST操作,python,forms,testing,flask,Python,Forms,Testing,Flask,我有一个flask应用程序,它具有如下视图功能: @login_required @app.route('/suspect_tracker/new_list', methods=['GET', 'POST']) def new_list(): form = ListForm() if form.validate_on_submit(): if form.private: privacy_setting = 1 else:

我有一个flask应用程序,它具有如下视图功能:

@login_required
@app.route('/suspect_tracker/new_list', methods=['GET', 'POST'])
def new_list():
    form = ListForm()
    if form.validate_on_submit():
        if form.private:
            privacy_setting = 1
        else:
            privacy_setting = 0
        new_list = List(name=form.name.data, last_updated=datetime.utcnow(), user_id=g.user.id, private=privacy_setting)
        db.session.add(new_list)
        db.session.commit()
        flash('New list %s added' % new_list.name)
        return redirect('/suspect_tracker/' + form.name.data)
    else:
        flash(form.name.errors)

    return render_template('newlist.html', title="Make a new list!", form=form)
from config import basedir
from app import app, db
from app.models import User, List, Suspect, SuspectList
from flask import g
from flask_testing import TestCase

class TestViews(TestCase):
    def create_app(self):
        app.config['TESTING'] = True
        app.config['WTF_CSRF_ENABLED'] = False
        app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
        self.client = app.test_client()

        return app

    def setUp(self):
        self.app = self.create_app()
        db.create_all()

        test_user = User(nickname="test")

        db.session.add(test_user)
        db.session.commit()

        g.user = User.query.filter_by(id=1).first()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

    def test_new_list_view(self):
        self.client.get('/suspect_tracker/new_list/')

        form = {'name':'Test', 'private':False}

        g.user = User.query.filter_by(id=1).first()

        self.client.post('/suspect_tracker/new_list', data=form)

        assert List.query.filter_by(name="Test").first() != None
我正试图为它编写一个测试,测试如下:

@login_required
@app.route('/suspect_tracker/new_list', methods=['GET', 'POST'])
def new_list():
    form = ListForm()
    if form.validate_on_submit():
        if form.private:
            privacy_setting = 1
        else:
            privacy_setting = 0
        new_list = List(name=form.name.data, last_updated=datetime.utcnow(), user_id=g.user.id, private=privacy_setting)
        db.session.add(new_list)
        db.session.commit()
        flash('New list %s added' % new_list.name)
        return redirect('/suspect_tracker/' + form.name.data)
    else:
        flash(form.name.errors)

    return render_template('newlist.html', title="Make a new list!", form=form)
from config import basedir
from app import app, db
from app.models import User, List, Suspect, SuspectList
from flask import g
from flask_testing import TestCase

class TestViews(TestCase):
    def create_app(self):
        app.config['TESTING'] = True
        app.config['WTF_CSRF_ENABLED'] = False
        app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
        self.client = app.test_client()

        return app

    def setUp(self):
        self.app = self.create_app()
        db.create_all()

        test_user = User(nickname="test")

        db.session.add(test_user)
        db.session.commit()

        g.user = User.query.filter_by(id=1).first()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

    def test_new_list_view(self):
        self.client.get('/suspect_tracker/new_list/')

        form = {'name':'Test', 'private':False}

        g.user = User.query.filter_by(id=1).first()

        self.client.post('/suspect_tracker/new_list', data=form)

        assert List.query.filter_by(name="Test").first() != None
运行测试后,断言失败,我已经测试过,在运行self.client.post之后,列表不包含新列表,仍然为空。这让我相信提交时form.validate\u返回了false,这让我相信我没有在test\u new\u list\u视图中的self.client.post函数中传递正确的数据。我的问题是,如何在测试函数中正确创建一个ListForm,然后使用self.client.POST发布它以测试新的_list函数


我已经解决了正确发送表单数据的问题,因此现在表单将进行验证,但我不知道如何将g.user设置为模拟用户,因此当我尝试运行测试时,我得到了一个AttributeError:“AnonymousUserMixin”对象没有属性“id”错误。

db来自何处?很抱歉,我只是复制了TestView类,而不是整个tests.py文件。我已经添加了tests.py中的导入,但是db是在测试文件的开头从app导入的。