【问题标题】:How to mock AWS Lambda context when testing lambda handler in Go?在 Go 中测试 lambda 处理程序时如何模拟 AWS Lambda 上下文?
【发布时间】: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


【解决方案1】:

‘context.Context’被设计成一个不可变的值(尽管它实际上是一个接口)。所以我不会担心嘲笑它。

有两种方法可以创建空上下文(“context.Background()”和“context.TODO()”)。我将从这些开始。如果您想在上下文中设置某些内容,请查看上下文包中的文档。

【讨论】:

  • 是的,我开始得出同样的结论,我不应该担心嘲笑它。特别是因为我找不到任何来自亚马逊的测试。谢谢!
【解决方案2】:

context.TODO 会满足您的需求吗?

https://golang.org/pkg/context/#TODO

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多