Лямбда-обработчик Pytest, передающий событие и контекст - PullRequest
3 голосов
/ 31 января 2020

Я пишу модульный тест для моей лямбда-функции, используя pytest. Я не могу понять, как мне передать параметры моего события в вызов функции. Я узнал, что это может быть достигнуто с помощью @ pytest.fixture. Я очень, очень плохо знаком с Python и pytest. Поверьте, я использую исправления неправильно. Пожалуйста, помогите мне !!

Ниже представлен мой лямбда-обработчик:

lambda_service.py

def lambda_handler(event, context):   
    logger.info('Event received: ' + json.dumps(event))
    try:
        sort = (event['sort'])
        size = int(event['size'])
        page = int(event['page'])

        list_response = MyService().get_people_list(sort, size, page)
        logger.info(list_response)

    except Exception as e:
        logger.error("Unable to fetch details")
        logger.exception(e)

    return list_response

Это мой тестовый класс-

class TestServiceHandler:
    @pytest.fixture
    def event(self):
        return {
            "sort": "asc",
            "size": 5,
            "page": 0
        }
    @pytest.fixture
    def context(self):
        return None

    def test_lambda_handler(self):
        result = lambda_service.lambda_handler(self.event, self.context)
        assert_valid_schema(result, 'vendor_list.json')

И я получаю ошибку ниже при запуске этого теста

line 17, in lambda_handler
sort = (event['sort'])\nTypeError: 'method' object is not subscriptable"

Хотя я передаю событие и контекст в фикстурах, он все еще ссылается на event[sort] внутри lambda_handler.

1 Ответ

1 голос
/ 01 февраля 2020

Вы правильно определили приборы, но неправильно их используете. Чтобы исправить, добавьте аргументы к методу test_lambda_handler, названному в точности как приборы. При запуске тестов pytest проанализирует каждый аргумент и вставит возвращаемое значение прибора, если сможет найти прибор с таким именем. Пример:

class TestServiceHandler:
    @pytest.fixture
    def event(self):
        ...
    @pytest.fixture
    def context(self):
        ...

    def test_lambda_handler(self, event, context):
        result = lambda_service.lambda_handler(event, context)
        assert ...
...