Flask.test_client().post 和 JSON 编码

我正在为 Flask 应用程序中的 JSON 端点编写测试用例。


import unittest

from flask import json

from app import create_app



class TestFooBar(unittest.TestCase):

    def setUp(self):

        self.app = create_app('testing')

        self.app_context = self.app.app_context()

        self.app_context.push()


    def test_ham(self):

        resp = self.client.post('/endpoint',

                                headers={'Content-Type': 'application/json'},

                                data=json.dumps({'foo': 2,

                                                 'bar': 3}))

        assert resp.status_code == 200


    def test_eggs(self):

        resp = self.client.post('/endpoint', data={'foo': 5,

                                                   'bar': 7})

        assert resp.status_code == 200


    def test_ham_and_eggs(self):

        with self.app.test_client() as self.client:

            self.test_ham()

            self.test_eggs()

只是为了了解发生了什么,POST在上面的代码中发送消息的两种方式都有意义吗?特别是,在第一种情况下,我是双 JSON 编码吗?


或者,简单地说,test_ham和之间有什么区别test_eggs?有没有?


慕容森
浏览 284回答 1
1回答

MM们

您不是对 JSON 进行双重编码,不,因为data不会将任何内容编码为 JSON。test_ham发布 JSON,test_eggs没有。从 Flask 1.0 开始,Flask 测试客户端支持直接发布 JSON,通过json关键字参数,使用它来减少样板代码:def&nbsp;test_ham(self): &nbsp;&nbsp;&nbsp;&nbsp;resp&nbsp;=&nbsp;self.client.post('/endpoint',&nbsp;json={'foo':&nbsp;2,&nbsp;'bar':&nbsp;3})&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;assert&nbsp;resp.status_code&nbsp;==&nbsp;200请参阅Flask测试文档章节的测试 JSON API部分:json在测试客户端方法中传递参数会将请求数据设置为 JSON 序列化对象并将内容类型设置为application/json。传递字典以data生成不同类型的请求,application/x-www-form-urlencoded编码请求就像<form method="POST" ...>表单一样会从浏览器中生成,并且必须通过对象访问foo和bar值。在需要发布 JSON 时不要使用它。request.form
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python