#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()
его