тест не выполняется, потому что flask возвращает поток вместо json

#python #flask #pytest #fixtures #pytest-bdd

#python #flask #pytest #приспособления #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)
    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]>.      
 

По-видимому create_entity , возвращает не простой объект, а потоковый ответ:

 <Response streamed [200 OK]>
 

Я не понимаю, почему это не вернет простой json, если контроллер возвращает json?

Ответ №1:

в вашем тесте есть несколько проблем

во-первых, вы не выполняетесь в тестовом контексте flask:

 @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
 

это должно быть yield flask_test_client — в противном случае диспетчер контекста завершится к моменту запуска вашего теста

во-вторых, вы получаете Response объект create_entity , потому что это то, что возвращает ваше @given устройство:

 @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
 

результатом .post(...) является Response объект, если вы хотите, чтобы это было dict json, вам нужно будет вызвать .get_json() его