【发布时间】:2018-09-27 10:04:56
【问题描述】:
我有一个用 Go 编写的 S3 触发的 AWS Lambda。我已经能够成功测试所有辅助代码,但是,我一直在尝试测试 lambda 处理程序。
这是我的处理程序的签名:
func HandleRequest(ctx context.Context, s3Event events.S3Event)
这是测试代码:
package main
import (
"context"
"encoding/json"
"testing"
"github.com/aws/aws-lambda-go/events"
"github.com/stretchr/testify/assert"
)
func TestHandleRequest(t *testing.T) {
// 1. read JSON from file
inputJSON, err := readJSONFromFile("./testdata/s3-event.json")
if err != nil {
t.Errorf("could not open test file. details: %v", err)
}
// 2. de-serialize into Go object
var inputEvent events.S3Event
if err := json.Unmarshal(inputJSON, &inputEvent); err != nil {
t.Errorf("could not unmarshal event. details: %v", err)
}
// 3. How can I mock the context.Context?
assert.NoError(t, HandleRequest(context.Context, inputEvent))
}
我不知道应该如何模拟 context.Context。我在网上也找不到任何例子。
有人知道吗?我的代码看起来是否适合测试 S3 触发的 Go Lambda?
【问题讨论】:
-
我自己没有尝试过,但是,也许可以看看 SDK 中的
lambdacontext.NewContext。这样,您应该能够自己添加数据,lambda 会添加。您可以使用context.Background()构建父上下文,并使用context包中的其他功能添加截止日期/取消它等。我不知道,如果 AWS 对上下文做了任何其他魔法,因此这可能不会完全复制所有功能。 -
为什么
HandleRequest没有http.Request, http.ResponseWriter对?如果是处理程序,您如何处理?
标签: amazon-web-services go aws-lambda