0

У меня есть приложение 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_user8 не работает? Есть ли другой подход, который я должен использовать?

ответ

1

Причина, почему код в вопросе не работает в том, что линия

current_user = AuthenticatedUser() 

создает новую локальную переменную с именем current_user. Это не то же самое, что и flask.ext.login.current_user.

Эта линия должна быть изменена на:

flask.ext.login.current_user = AuthenticatedUser() 

 Смежные вопросы

  • Нет связанных вопросов^_^