Pytest в Flask test get_single_object, передав идентификатор - PullRequest
1 голос
/ 03 августа 2020

Я пишу тесты для своего flask api и использую Python (3.7). У меня есть функция представления, позволяющая получить один объект, передав его идентификатор в маршруте, теперь я хочу написать модульный тест для этого представления.

Вот что я сделал до сих пор:

From view function:

@api.route("/book/<int:id>", methods=["GET", "PUT", "DELETE"])
def single_book(id):
    conn = db_connection()
    cursor = conn.cursor()
    book = {}
    if request.method == "GET":
        try:
            cursor.execute("SELECT * FROM BOOK WHERE id=?", (id,))
            rows = cursor.fetchall()
            for r in rows:
                book = r
            book = {
                "id": book[0],
                "author": book[1],
                "title": book[2],
                "shortDescription": book[3],
                "thumbnailUrl": book[4],
                "status": book[5],
                "pageCount": book[6],

            }
            conn.close()
        except Error as e:
            return 'SQL Error'
        print(book)
        if book is not None:
            return jsonify(book), 200
        else:
            return "Something wrong", 404

From testing file:

@pytest.fixture
def client():
    app.config['TESTING'] = True
    db_fd, app.config['DATABASE'] = tempfile.mkstemp()

    with app.test_client() as client:
        with app.app_context():
            create_table()
            yield client
    os.close(db_fd)
    os.unlink(app.config['DATABASE'])
    # return app.test_client()

def api_single_book(client, book_id):
    return client.get('/api/book/{}'.format(book_id), follow_redirects=True)

@pytest.mark.parametrize('id', [1])
def test_single_book(client, id):
    resp = api_single_book(client, id)
    assert resp.status_code == 200

Теперь, если я запускаю команду pytest, все остальные тесты пройдены, только этот не прошел со следующей ошибкой:

E KeyError: 0

и указывает на эту строку:

> "id": книга [0],

1 Ответ

2 голосов
/ 03 августа 2020

Что произойдет, если запрос вернет None? И почему вы снова определяете book в l oop? Будет только последняя в l oop. Я думаю, вы хотите переопределить свой запрос или l oop, но я буду использовать то, что у вас есть.

Попробуйте следующее:

for r in rows:
    print(r) # to see what you have
    book = {
        "id": r[0],
        "author": r[1],
        "title": r[2],
        "shortDescription": r[3],
        "thumbnailUrl": r[4],
        "status": r[5],
        "pageCount": r[6],
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...