Unit testing 如何对使用AWS SDK for Go V2实现的Lambda进行单元测试

Unit testing 如何对使用AWS SDK for Go V2实现的Lambda进行单元测试,unit-testing,go,aws-lambda,amazon-dynamodb,Unit Testing,Go,Aws Lambda,Amazon Dynamodb,给定以下用Go编写的简单lambda,它只返回一个表描述 package main import ( "context" "encoding/json" "fmt" "log" "net/http" "os" "strings" "github.com/aws/aws-lambda

给定以下用Go编写的简单lambda,它只返回一个表描述

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"
    "strings"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
    "go.uber.org/zap"
)

var (
    dynamoDBTableName = aws.String(os.Getenv(EnvDynamoDBTableName))

    logger = func() *zap.Logger {
        l, err := zap.NewProduction()
        if err != nil {
            log.Printf("failed to create zap logger: %v", err)
        }
        return l
    }()
)

func handler(ctx context.Context, req events.APIGatewayProxyRequest) 
    (events.APIGatewayProxyResponse, error) {

    defer logger.Sync()

    resp := events.APIGatewayProxyResponse{}

    cfg, err := config.LoadDefaultConfig(ctx)
    if err != nil {
        logger.Error("failed to load AWS config", zap.Error(err))
        return resp, fmt.Errorf("failed to load AWS config: %w", err)
    }

    svc := dynamodb.NewFromConfig(cfg)

    // fake logic
    t, err := svc.DescribeTable(ctx, &dynamodb.DescribeTableInput{TableName: dynamoDBTableName})
    if err != nil {
        logger.Error("failed to describe table", zap.String("table-name", *dynamoDBTableName), zap.Error(err))
    }
    var sb strings.Builder
    enc := json.NewEncoder(&sb)
    err = enc.Encode(t.Table)
    if err != nil {
        logger.Error("failed to JSON encode response", zap.Error(err))
    }
    resp.Body = sb.String()
    resp.StatusCode = http.StatusOK

    return resp, nil
}

func main() {
   lambda.Start(handler)
}
。。。如何在本地对其进行单元测试?在旧SDK中,可以像这样使用依赖项注入:

type deps struct 
    svc dynamodbiface.DynamoDBAPI
    table string
}

func (d *deps) handler(ctx context.Context, req events.APIGatewayProxyRequest) 
    (events.APIGatewayProxyResponse, error) {
    
    ...
}

func main() {
   s := session.Must(session.NewSession())
   d := deps {
       svc: dynamodb.New(s),
       table: dynamoDBTableName,
   }

   lambda.Start(d.handler)
}

如果我需要上下文来加载
dynamodb.NewFromConfig
所需的配置,那么如何测试使用新的AWS SDK for Go V2编写的lambda?

我认为您只需在单元测试中启动一个新上下文,试着使用
context.TODO()
。然后,您可以使用ENV vars设置一些仅用于测试目的的凭据,sdk将正确解析它们