我正在运行单元测试(Pytest),以调用模拟的Lambda(带有Moto)并期望得到响应。假设我们正在导入boto3并创建了一个lambda客户端常量。这是函数:
def invoke_lambda():
request = {'message': 'Hello World!'}
lambda_response = LAMBDA_CLIENT.invoke(
FunctionName='hello-world-lambda',
InvocationType='RequestResponse',
Payload=json.dumps(request)
)
response = lambda_response['Payload'].read()
print(response)
return response
这是我的单元测试:
import zipfile
import boto3
from moto import mock_lambda
CLIENT = boto3.client('lambda', region_name='us-east-1')
# Expected response setup and zip file for lambda mock creation
def lambda_event():
code = '''
def lambda_handler(event, context):
return event
'''
zip_output = io.BytesIO()
zip_file = zipfile.ZipFile(zip_output, 'w', zipfile.ZIP_DEFLATED)
zip_file.writestr('lambda_function.py', code)
zip_file.close()
zip_output.seek(0)
return zip_output.read()
# create mocked lambda with zip file
def mock_some_lambda(lambda_name, return_event):
return CLIENT.create_function(
FunctionName=lambda_name,
Runtime='python2.7',
Role='test-iam-role',
Handler='lambda_function.lambda_handler',
Code={
'ZipFile': return_event,
},
Publish=True,
Timeout=30,
MemorySize=128
)
# Test function
@mock_lambda
def test_invoke_lambda():
mock_some_lambda('hello-world-lambda', lambda_event)
response = function_code.invoke_lambda()
assert response['message'] == 'Hello World!'
运行Pytest时,我看到Lambda响应是:b“运行lambda时出错:(2,“ WaitNamedPipe”,“系统找不到指定的文件。”)”
关于如何解决此问题的任何想法?我从Google搜索中看到了一些指向docker的问题,但是据我了解,Moto应该能够直接使用此东西,而无需在docker容器中运行它。帮助会很棒:)
答案 0 :(得分:1)
使用 moto 模拟 AWS lambda 需要 docker。
如果 docker 未运行,您将看到错误:
'error running docker: Error while fetching server API version: (2, 'CreateFile', '系统找不到指定的文件。')'
答案 1 :(得分:0)
结果证明,我只需要安装Docker for Windows并运行Docker ...我不再看到此问题,因此我认为一切都很好。 – SamN刚编辑