У меня есть приложение Flask, использующее LDAP для аутентификации, с несколькими конечными точками, управляемыми с помощью фляжки, но я хочу, чтобы тестировать завершенные конечные точки без, фактически попав на сервер LDAP. Я надеялся сделать это, подделав флэшку-логин current_user
, но мне не удалось заставить этот трюк работать. Вот то, что я пробовал:Тестирование аутентифицированных конечных точек в Flask
Endpoints идентифицируются, потому что я получить все ресурсы из своего собственного класса (это работает отлично на практике и ручного тестирования, а также то, что колба-успокоительные рекомендует):
def authenticate(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
if not getattr(func, 'authenticated', True):
return func(*args, **kwargs)
if flask.ext.login.current_user and flask.ext.login.current_user.is_authenticated():
return func(*args, **kwargs)
flask.ext.restful.abort(401)
return wrapper
class AuthenticatedResource(flask.ext.restful.Resource):
method_decorators = [authenticate]
Вот простая конечная точка:
class RootResource(AuthenticatedResource):
def get(self):
return {'message':'Hello'}
Теперь в моем модульном тестировании, я полагал, что я должен быть в состоянии дразнить аутентификацию пользователя, написав колбовые Войти current_user
-х:
from flask.ext.login import UserMixin, current_user
class AuthenticatedUser(UserMixin):
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return "Test User"
class TestMyAPI(unittest.TestCase):
def test_root_endpoint_responds_properly(self):
with app.test_client() as client:
current_user = AuthenticatedUser()
response = client.get('/')
self.assertEqual(response.status_code, 200)
body = json.loads(response.data)
self.assertEqual(body, {'message':'Hello'})
К сожалению, тест реагирует с отказом:
==================================================================
FAIL: test_root_endpoint_responds_properly (test_my_api.TestMyAPI)
------------------------------------------------------------------
Traceback (most recent call last):
File "xxxx/test_graph_api.py", line xxx, in test_root_endpoint_responds_properly
self.assertEqual(response.status_code, 200)
AssertionError: 401 != 200
Другие примечания: Я использую флягу 0,9, а не 0,10. Я знаю Miguel Grinberg's answer to a similar problem, но на самом деле я не хочу вызывать логин; Я хочу полностью обойти использование LDAP (или любой тестовой базы данных).
Почему утилита current_user
8 не работает? Есть ли другой подход, который я должен использовать?