#python #pytest #moto
Вопрос:
У меня есть пример использования, когда я издеваюсь над лямбда-функцией с помощью moto. Все отлично работает на моей локальной машине, но как только я нажимаю код и он запускается внутри python:3.8-slim
контейнера, каким-то образом издевательская лямбда не возвращает должного ответа.
def _process_lambda(func_str):
zip_output = io.BytesIO()
zip_file = zipfile.ZipFile(zip_output, "w", zipfile.ZIP_DEFLATED)
zip_file.writestr("lambda_function.py", func_str)
zip_file.close()
zip_output.seek(0)
return zip_output.read()
def get_test_zip_file1():
pfunc = """
from datetime import datetime
data={}
data['execution'] = {
'started_timestamp': datetime.utcnow().isoformat()
}
def lambda_handler(event, context):
print("custom log event")
return {'body':metadata}
"""
return _process_lambda(pfunc)
А ниже приведено, где я на самом деле создаю функцию и пишу некоторые утверждения.
@mock_lambda
def test_mock_some_lambda(lambda_mock):
import app
lambda_mock.create_function(
FunctionName='abc',
Runtime='python3.7',
Role=get_role_name(),
Handler='lambda_function.lambda_handler',
Code={"ZipFile": get_test_zip_file1()},
Publish=True,
Timeout=30,
MemorySize=128
)
response=lambda_mock.invoke(
FunctionName='abc'
)
response=json.load(response['Payload'])
assert 'body' in response
Это прекрасно проходит на моем локальном устройстве, но внутри контейнера я получаю: AssertionError: assert 'body' in {}
. Таким образом, похоже, что макет лямбды действительно создается внутри контейнера (в противном случае invoke выдал бы 404), но он возвращает {} вместо дикта, имеющего «тело» в качестве одного ключа.
Как эти вещи ведут себя по-другому ?
ОБНОВЛЕНИЕ— Похоже, что локально вызов выполняется синхронно, но внутри контейнера он выполняется синхронно. Затем я явно указал InvocationType='RequestResponse'
параметр при вызове функции. Теперь я настраиваюсь /usr/local/lib/python3.8/json/decoder.py:355: JSONDecodeError
, когда пытаюсь загрузить полезную нагрузку.