首页 > 解决方案 > 如果流中有多个 GetItem(),如何模拟 AWS DynamoDB?

问题描述

事件处理程序.go

func eventHandler(Id) error {
    eventDetails, err := GetEventStore(svc.Connection.DynamoDBClient, Id)
    if err != nil {
        log.Error("Error while reading Store", err)
        return err
    }
    if eventDetails.status == "completed" {
        config, err := GetConfig(svc.Connection.DynamoDBClient, Key)
        if err != nil {
            log.Error("Error while reading Config Store", err)
            return err
        }
        // process it
    }
  return nil
}

我们的大部分数据都存储在存储中,因此在为 eventHandler 编写单元测试时如何使用多个 GetItemOutput 模拟DynamoDB?

eventHnadler_test.go

...
eventDetails := {
 //data
}
config := {
//data
}
        DB := client.DynamoDBClient{
            Client: mockDynamoDB{
                Output: dynamodb.GetItemOutput{
                    Item: eventDetails,
                },
                Error: tc.Error,
            },
        }
...

可以在 GO aws sdk v2 中模拟多个 get 调用吗?

标签: unit-testinggoamazon-dynamodb

解决方案


因为 AWS dynamo DB 进行了重组所以

github.com/aws/aws-sdk-go-v2/service/dynamodb/dynamodbiface不再存在您必须实现自己的界面才能进行适当的发电机模拟

您的围绕 aws 实施的包装器应该是类似的东西

type Dynamodb struct {
    Client  DynamoAPI
}

type DynamoAPI interface {
        GetItem(ctx context.Context, params *dynamodb.GetItemInput, optFns ...func(*dynamodb.Options)) (*dynamodb.GetItemOutput, error)
        UpdateItem(ctx context.Context, params *dynamodb.UpdateItemInput, optFns ...func(*dynamodb.Options)) (*dynamodb.UpdateItemOutput, error)
        PutItem(ctx context.Context, params *dynamodb.PutItemInput, optFns ...func(*dynamodb.Options)) (*dynamodb.PutItemOutput, error)
        DeleteItem(ctx context.Context, params *dynamodb.DeleteItemInput, optFns ...func(*dynamodb.Options)) (*dynamodb.DeleteItemOutput, error)
        Query(ctx context.Context, params *dynamodb.QueryInput, optFns ...func(*dynamodb.Options)) (*dynamodb.QueryOutput, error)
        Scan(ctx context.Context, params *dynamodb.ScanInput, optFns ...func(*dynamodb.Options)) (*dynamodb.ScanOutput, error)
    }

这可能是你的嘲笑

type mockDynamodb struct {
    rbaws.DynamoAPI
    *dynamodb.Client
    clientError error
}

func (m mockDynamodb) GetItem(ctx context.Context, params *dynamodb.GetItemInput, optFns ...func(*dynamodb.Options)) (*dynamodb.GetItemOutput, error) {

    return &dynamodb.GetItemOutput{
        Item: map[string]types.AttributeValue{},
    }, m.clientError
}

推荐阅读