Python 测试失败,因为flask返回的是json流

Python 测试失败,因为flask返回的是json流,python,flask,pytest,fixtures,pytest-bdd,Python,Flask,Pytest,Fixtures,Pytest Bdd,我是我的flask应用程序,我有一个路由/控制器,可以创建我称之为实体的东西: @api.route('/entities', methods=['POST']) def create_entity(): label = request.get_json()['label'] entity = entity_context.create(label) print('the result of creating the entity: ') print(entity

我是我的flask应用程序,我有一个路由/控制器,可以创建我称之为实体的东西:

@api.route('/entities', methods=['POST'])
def create_entity():
    label = request.get_json()['label']
    entity = entity_context.create(label)
    print('the result of creating the entity: ')
    print(entity)
    return entity
创建实体后,将打印以下内容:

the result of creating the entity: 
{'label': 'Uganda', '_id': '{"$oid": "5ff5df24bb80fcf812631c53"}'}
我为此控制器编写了以下测试:

@given("an entity is created with label Uganda", target_fixture="create_entity")
def create_entity(test_client):
    result = test_client.post('api/entities', json={"label": "Uganda"})
    return result

@then("this entity can be read from the db")
def get_entities(create_entity, test_client):
    print('result of create entity: ')
    print(create_entity)
    response = test_client.get('api/entities').get_json()
    assert create_entity['_id'] in list(map(lambda x : x._id, response))
测试客户端在
conftest.py
中定义如下:

@pytest.fixture
def test_client():
    flask_app = init_app()
    # Create a test client using the Flask application configured for testing
    with flask_app.test_client() as flask_test_client:
        return flask_test_client
我的测试失败,出现以下错误:

create_entity = <Response streamed [200 OK]>, test_client = <FlaskClient <Flask 'api'>>

    @then("this entity can be read from the db")
    def get_entities(create_entity, test_client):
        print('result of create entity: ')
        print(create_entity)
        response = test_client.get('api/entities').get_json()
>       assert create_entity['_id'] in list(map(lambda x : x._id, response))
E       TypeError: 'Response' object is not subscriptable

the result of creating the entity: 
{'label': 'Uganda', '_id': '{"$oid": "5ff5df24bb80fcf812631c53"}'}
result of create entity: 
<Response streamed [200 OK]>.      

我不明白如果控制器返回json,为什么它不会返回简单的json?

您的测试有一些问题

首先,您没有在烧瓶测试上下文中执行:

@pytest.fixture
def测试_客户端():
flask_app=init_app()
#使用为测试配置的Flask应用程序创建测试客户端
使用flask_app.test_client()作为flask_test_客户端:
返回烧瓶\u测试\u客户端
这需要是
test\u client
——否则在测试运行时上下文管理器已经退出

其次,对于
创建实体
,您将得到一个
响应
对象,因为这就是您的
@给定
装置返回的结果:

@given(“使用标签乌干达创建实体”,target_fixture=“create_entity”)
def创建实体(测试客户端):
result=test_client.post('api/entities',json={“label”:“乌干达”})
返回结果
.post(…)
的结果是一个
响应
对象,如果您希望它成为json的一部分,您需要调用
.get_json()

<Response streamed [200 OK]>