LINUX.ORG.RU

Flask + pytest

 , , , ,


0

1

Всем привет.

В python и фляжке новичек. Встал вопрос о тестировании. Вот, предположим есть обработчик запроса:

@app.route('/', methods=['GET'])
def show_index():
    '''
    Отображение главной страницы
    '''
    users = UserModel().all()
    return render_template('index.html', users=users)

Хочу написать тест, который просто проверяет код ответа:

client = app.test_client()

def test_show_index():
    res = client.get('/')
    assert res.status_code == 200

Но мне не нравится, что под капотом данный тест делает реальный запрос к базе, так как в обработчике запроса вызывается модельный метод: UserModel().all()

Пытаюсь замокать данный метод:

client = app.test_client()

@pytest.fixture
def mock_user():
    return Mock(spec=UserModel)

def test_show_index(mock_user):
    mock_user.all.return_value = [{"id": 1, "username": "Test User"}]
    res = client.get('/')
    assert res.status_code == 200

Но данное мокирование не работает. Под капотом все также - реальный запрос к БД.

Подскажите, как правильно мокать такие вещи? Какие best-practices ксть на этот случай?


Пытаюсь замокать

данное мокирование не работает

как правильно мокать

Я думаю для начала надо правильно мысль изгалать научиться

Siado ★★★★★
()

Навскидку (не проверял)

mock_user.return_value.all.return_value = [{"id": 1, "username": "Test User"}]

AlexKiriukha ★★★★
()

Ну, для тестов нужно в идеале реальную базу создавать, тока новую и тестовую, заполненную тестовыми данными. После теста удалять. Это всё автоматически, естественно. А не париться с тем, что твоя дев база загаживается. На лету менять базу сможешь?

menangen ★★★★★
()

Я обычно использую mock.patch.object, потому как обычный мок как-то ну очень хорово реализован. Для твоих целей он тоже подойдет, правда кода будет больше

Aswed ★★★★★
()

mock.patch.object в помощь

q13
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.