【问题标题】:How to mock AWS DynamoDB if multiple GetItem() in flow?如果流中有多个 GetItem(),如何模拟 AWS DynamoDB?
【发布时间】:2021-12-24 20:43:34
【问题描述】:

eventHandler.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-testing go amazon-dynamodb


【解决方案1】:

因为 AWS dynamo DB 如此重组

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

您的 Wrapper 围绕 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
}

【讨论】:

  • 是的,但我在我的 eventHandler(Id) 函数中进行了 2 个 GetItem 调用,因此我们只能设置 1 个 GetItem 调用数据正确 - Item: eventDetails 但对于第二次调用,它将返回再次使用 eventDetails 而不是 configDetails,因为输出 Item 具有硬编码值。知道如何在GetItem 调用上设置不同的输出数据吗?
  • 这是正确的方式还是存在其他方式? @mooga func (m mockDynamodb) GetItem(ctx context.Context, params *dynamodb.GetItemInput, optFns ...func(*dynamodb.Options)) (*dynamodb.GetItemOutput, error) { if (params.tablename == “eventDetails”) { return &dynamodb.GetItemOutput{ Item: eventDetails, }, m.clientError } else { return &dynamodb.GetItemOutput{ Item: configDetails, }, m.clientError } }
  • 我看不清楚,但总的来说params.TableName 是的,我会根据请求属性更改我的回复
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2019-08-30
  • 1970-01-01
  • 2013-10-05
  • 2021-04-13
相关资源
最近更新 更多