Я пытаюсь создать несколько тестов для приложения 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, или есть что-то еще, что мне не хватает.