有没有办法在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'
)
答案 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()