为Flask测试客户端设置默认content_type

时间:2017-12-12 15:15:08

标签: python unit-testing flask

有没有办法在Flask中为测试客户端设置默认content_type值?

例如,如果我有以下测试:

import unittest

class MyTestCase(unittest.TestCase):

    def setUp(self):
        from my_flask_project import app
        self.client = app.test_client()

    def test_request_one(self):
        self.client.post(
            data='{}'
            content_type='application/json'
        )

    def test_request_two(self):
        self.client.post(
            data='{}'
            content_type='application/json'
        )

我的所有测试用例都将设置为content_type='application/json'。我想将application/json设置为请求的默认内容类型,但我找不到有关如何执行此操作的任何文档。

这样的事情是理想的:

def setUp(self):
    from my_flask_project import app
    self.client = app.test_client(
        default_content_type='application/json'
    )

2 个答案:

答案 0 :(得分:2)

对于大多数标头,您可以传递environ_base dict来设置其他标头。但是,测试客户端将always set the Content-Type header传递给传入的值,从而覆盖基础。还有environ_overrides,它可以覆盖该覆盖,但这意味着你不能将标题设置为其他任何东西,这可能不是你想要的。

创建一个自定义TestClient类,设置默认内容类型(如果未传递)。将该类分配给Flask应用test_client_class,并在创建测试客户端时使用它。

from flask.testing import FlaskClient

class CustomClient(FlaskClient):
    def open(self, *args, **kwargs):
        kwargs.setdefault('content_type', 'application/json')
        return super().open(*args, **kwargs)

app.test_client_class = CustomClient

您可以将此技术用于任何arg,而不只是content_type,包括environ_base

答案 1 :(得分:0)

我发现一个更简单的解决方案是使用 Client 参数 json 而不是 data。这样就可以明确发送什么数据,但不需要设置/覆盖标头。

来自烧瓶 docs

<块引用>

测试 JSON API 时的捷径是将 dict 传递给 json 而不是使用数据。这将自动调用 json.dumps() 并将内容类型设置为 application/json。此外,如果应用程序返回 JSON,response.json 将自动调用 json.loads()。

response = client.post("/api", json={"a": "value", "b": 1})
obj = response.json()