Проблемы с путями при попытке исправления или установки обезьяны функции, вызываемой в Flask API - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь создать несколько тестов для приложения Flask и пытаюсь заставить некоторые из насмешек / исправлений работать, как и ожидалось.

Несмотря на то, что трачу время на чтение / обдумывание документации около где исправить , ни @patch, ни monkeypatch не ведут себя так, как я ожидаю, и я изо всех сил пытаюсь понять, что я делаю неправильно.

В файле Flask api.py, который яу меня есть простой API входа в систему, который проверяет требование авторизации (определенное в другом месте и импортированное, как показано):

from project_name.api.auth import login_auth

@api.route('/v1/login', methods=['POST'])

    data = request.get_json()

    username = data['Username']
    password = data['Password']

    if not login_auth(username, password):
        raise APIError('Invalid Username or Password')
    ...

, и я заинтересован в исправлении функции login_auth, чтобы я мог тестировать без реального имени пользователя /пароль.

В моем файле pytest я попытался использовать и patch, и monkeypatch, чтобы решить эту проблему.

@patch подход:

@patch('project_name.api.auth.login_auth')
def test_login(mock_login_auth, client):
    mock_login_auth.return_value = True
    mimetype = 'application/json'
    headers = {
        'Content-Type': mimetype,
        'Accept': mimetype
    }
    data = {
        'Username': "test_user",
        'Password': "test_password",
    }
    url = 'api/v1/login'

    assert project_name.api.auth.login_auth('x', 'y') == True                                                                                                                                                                                                               

    response = client.post(url, data=json.dumps(data), headers=headers)
    assert response.status_code == 200

И если я выполню этот тест, то первый оператор assert, который напрямую вызывает пропатченную функцию, будет работать должным образом, однако вызов API не будет использовать фиктивную login_auth функцию, и тест не пройдёт этот критерий.

monkeypatch подход:

def test_login2(client, monkeypatch):
    monkeypatch.setattr("project_name.api.auth.login_auth", lambda x, y: True)
    mimetype = 'application/json'
    headers = {
        'Content-Type': mimetype,
        'Accept': mimetype
    }
    data = {
        'Username': "test_user",
        'Password': "test_password",
    }
    url = 'api/v1/login'

    assert project_name.api.auth.login_auth('x', 'y') == True                                                                                                                                                                                                               

    response = client.post(url, data=json.dumps(data), headers=headers)
    assert response.status_code == 200

И снова, я вижу первое утверждение, которое вызывает функцию напрямую, исправляется, как и ожидалось, но функция вызывается послезапрос к API не был пропатчен, поэтому тест не пройден для второго оператора assert.

Я пробовал несколько различных подходов, в том числе пытался исправить login_auth по пути project_name.api.login_auth (в предположении, что я пытаюсь исправить определенную функцию login_auth, которая импортируется в файл api.py), но правильный подход мне не ясен.

Мне интересно, есть ли что-то конкретное, что мне нужно сделать, учитывая, что я использую подход Flask test_client, или есть что-то еще, что мне не хватает.

...