如何将 QuerySelectField 表单数据发送到单元测试中的 Flask 视图?

我正在尝试在我正在处理的烧瓶应用程序中测试编辑和添加视图。网站的一个版本已部署并且视图正常工作,但我正在进行的测试似乎没有正确传递 QuerySelectField 数据。此外,在测试时,我会检查表单数据是否有效并且确实有效,所以它应该通过。


下面是测试:


class TestingWhileLoggedIn(TestCase):

    def create_app(self):

        app = c_app(TestConfiguration)

        return app


    # executed prior to each test

    def setUp(self):

        self.app_context = self.app.app_context()

        self.app_context.push()

        db.create_all()


        login(self.client, '******', '******')


    # excuted after each test

    def tearDown(self):

        db.session.remove()

        db.drop_all()

        self.app_context.pop()


        logout(self.client)


    def test_add_post_page_li(self):

        p_cat = PostCategory(name='Resources')

        p_cat1 = PostCategory(name='Ressdgources')

        p_cat2 = PostCategory(name='Ressdgsdgources')

        p_cat3 = PostCategory(name='Reurces')

        db.session.add(p_cat)

        db.session.add(p_cat1)

        db.session.add(p_cat2)

        db.session.add(p_cat3)

        db.session.commit()


        all_cats = PostCategory.query.all()


        self.assertEqual([p_cat,p_cat1,p_cat2,p_cat3], all_cats)


        response = self.client.get('/add_post', follow_redirects=False)

        self.assertEqual(response.status_code, 200)


        data = dict(title='Hello', content='fagkjkjas', category=p_cat)


        form = PostForm(data=data)


        # this test passes!

        self.assertEqual(form.validate(), True)


        # printing the data to see what it is

        print(form.data)


        response_1 = self.client.post('/add_post', follow_redirects=False, data=form.data, content_type='multipart/form-data')


        # this one fails

        self.assertEqual(response_1.status_code, 302)


        new_post = db.session.query(Post).filter_by(name='Hello').first()


        self.assertNotEqual(new_post, None)

以下是测试的终端输出。最后两个失败与我发布的问题相同,所以我将它们排除在外。


字典打印输出来自我注入的一些打印语句,以帮助我理解问题。第一个字典是当没有表单提交到 add_post 视图时,第二个字典来自测试,它显示类别字段已填写,最后一个字典来自 add_post 视图,显示类别未填写。


慕姐8265434
浏览 88回答 1
1回答

繁花不似锦

Flask discord 服务器上的一位乐于助人的人能够为我回答这个问题。问题是 Flask-wtforms 不传递模型的整个实例,而是只传递主键。解决方案是只传递数据字典中的主键,如下所示:class TestingWhileLoggedIn(TestCase):    def create_app(self):        app = c_app(TestConfiguration)        return app    # executed prior to each test    def setUp(self):        self.app_context = self.app.app_context()        self.app_context.push()        db.create_all()        login(self.client, '******', '*****')    # executed after each test    def tearDown(self):        db.session.remove()        db.drop_all()        self.app_context.pop()        logout(self.client)    def test_add_post_page_li(self):        p_cat = PostCategory(name='Resources')        p_cat1 = PostCategory(name='Ressdgources')        p_cat2 = PostCategory(name='Ressdgsdgources')        p_cat3 = PostCategory(name='Reurces')        db.session.add(p_cat)        db.session.add(p_cat1)        db.session.add(p_cat2)        db.session.add(p_cat3)        db.session.commit()        all_cats = PostCategory.query.all()        self.assertEqual([p_cat,p_cat1,p_cat2,p_cat3], all_cats)        response = self.client.get('/add_post', follow_redirects=False)        self.assertEqual(response.status_code, 200)        # the following line was changed from having category=p_cat to        # category=p_cat.id        data = dict(title='Hello', content='fagkjkjas', category=p_cat.id)        #        # The following code has been commented out since it is no longer needed        #        # form = PostForm(data=data)        #        # this would not pass anymore        # self.assertEqual(form.validate(), True)        #        # printing the data to see what it is        # print(form.data)        # This line was changed from having data=form.data to data=data        response_1 = self.client.post('/add_post', follow_redirects=False, data=data, content_type='multipart/form-data')        # this one fails        self.assertEqual(response_1.status_code, 302)        new_post = db.session.query(Post).filter_by(name='Hello').first()        self.assertNotEqual(new_post, None)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python