как избежать декораторов при юнит-тестировании в приложении python flask - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в питоне и фляге.Я хотел создать модульные тесты для написанного API.Для аутентификации мы использовали jwt.

Для модульного тестирования я не хочу, чтобы поток входил в декоратор @jwt_required.В дополнение к этому я добавил несколько других декораторов для этого метода.

class A():

   @jwt_required()
   @mandatory_fields_check
   @unlock_and_lock()
   def get(self, address, name): 
      ..
      ..
      ..
       return jsonify(
            {"payload": data,
             "message": "data received successfully"}), 200

Юнит-тест Я пытаюсь написать

def test_get():
   a_obj = A()
   a_obj.get("address123", 'xyz')

Когда я запускаю выше тест с использованием py.test, я получаю сообщение об ошибке выполнения

    def _find_app():
            top = _app_ctx_stack.top
            if top is None:
               raise RuntimeError(_app_ctx_err_msg)
     RuntimeError: Working outside of application context.
E
E           This typically means that you attempted to use functionality that needed
E           to interface with the current application object in some way. To solve
E           this, set up an application context with app.app_context().  See the
E           documentation for more information.

Нижемои цели:

  1. Я не хочу, чтобы поток входил в логику декораторов

  2. JWT-декоратор запрашивает контекст.Однако я собираюсь протестировать этот метод как обычный метод класса без каких-либо функций колбы.

  3. Как смоделировать объекты, созданные внутри тестируемого метода?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я использовал эту библиотеку под названием undecorated, и она прекрасно работает для меня.https://stackoverflow.com/a/35418639

https://pypi.org/project/undecorated/

Это чисто, однако, если есть какой-либо более простой способ без импорта библиотек, пожалуйста, предложите.

0 голосов
/ 20 сентября 2018

на основе описания здесь

Должно быть так, но не проверено.

import mock
def mock_jwt_required(realm):
    return

@mock.patch('flask_jwt.jwt_required', side_effect=mock_jwt_required)
def test_get(jwt_required_fn):
    a_obj = A()
    a_obj.get("address123", 'xyz')
...