亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何對使用適用于 Go V2 的 AWS 開發工具包實現的 Lambda 進行單元測試

如何對使用適用于 Go V2 的 AWS 開發工具包實現的 Lambda 進行單元測試

Go
汪汪一只貓 2022-08-15 16:17:50
給定以下用 Go 編寫的簡單 lambda,它只返回一個表描述...package mainimport (    "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) {        ...}如何測試使用新的適用于 Go V2 的 AWS 開發工具包編寫的 lambda,因為我需要上下文來加載所需的配置?dynamodb.NewFromConfig
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

首先,使你的處理程序成為一個不起眼的對象,這樣我們就可以“跳過”測試它:


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

    (events.APIGatewayProxyResponse, error) {

    dynamoWrapper := &RealDynamoWrapper{}

    proxyController := &ProxyController{DynamoWrapper: dynamoWrapper}

    return proxyController.proxy(ctx, req)

這個想法是使處理程序函數變得謙卑,方法是讓它將所有復雜性委托給 .proxyController


現在,讓我們考慮要測試的,我們需要先定義它:ProxyController


type ProxyController struct {

  dynamoWrapper DynamoWrapper

}


func(controller *ProxyController) Proxy(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

  // this is where your implementation lives that you need to mock stuff for


  // We are mocking this line from your question

  svc := controller.dynamoWrapper.NewFromConfig(...)


  // do other stuff and then return something

  return events.APIGatewayProxyResponse{}, nil

}

你可以看到我將依賴于一個包裝版本的dynamo,它看起來像這樣:


type DynamoWrapper interface {

  NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client

}

現在,此包裝器的真正實現,上面引用的那個將像對 sdk 執行操作一樣進行調用。但是,對于我們的測試,我們想要一個模擬實現:RealDynamoWrapper


type mockDynamoWrapper struct {

  NewFromConfigFunc func(aws.Config, ...func(*Options)) *Client

}


func(dynamoWrapper *mockDynamoWrapper) NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {

  return dynamoWrapper.NewFromConfigFunc(cfg, optFns...)

}

最后,在測試中,您現在可以模擬發電機調用:


func TestProxyController(t *testing.T) {

  // given

  dynamoWrapper := &mockDynamoWrapper{}

  proxyController := &ProxyController{DynamoWrapper: mockDynamoWrapper}

  request := events.APIGatewayProxyRequest{}

  dynamoWrapper.NewFromConfigFunc = func(aws.Config, ...func(*Options)) *Client {

    // setup your mock function to do whatever you want

  }


  // when

  proxyController.proxy(context.Background, request)


  // then do your asserts

}


查看完整回答
反對 回復 2022-08-15
  • 1 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號