首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写单元测试aws-sdk-go-v2 dynamodb实现

如何编写单元测试aws-sdk-go-v2 dynamodb实现
EN

Stack Overflow用户
提问于 2018-05-16 18:21:35
回答 2查看 7.3K关注 0票数 1

我仍然在掌握go-接口,我可以模拟WaitUntilTableExists功能。但无法嘲笑PutItemRequest

这是我的main.go片段

代码语言:javascript
复制
func MyPutItem(d mydata, client dynamodbiface.DynamoDBAPI) error {
    input := &dynamodb.PutItemInput{
        ....
    }
    req := client.PutItemRequest(input)
    result, err := req.Send()
    log.Println(result)
    return err
}

main_test.go片段

代码语言:javascript
复制
type mockDynamoDBClient struct {
    dynamodbiface.DynamoDBAPI
}

func (m *mockDynamoDBClient) PutItemRequest(input *dynamodb.PutItemInput) dynamodb.PutItemRequest {
    // Most probably this is where I need your help
}

func TestStoreInDynamoDB(t *testing.T) {
    var mockClient = new(mockDynamoDBClient)
    d := mydata{}
    result := DynampDBPutItem(d, mockClient)
    t.Log(result)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-29 13:08:12

像这样假装SDK是有效的:

main_test.go

代码语言:javascript
复制
type fakeDynamoDBClient struct {
    dynamodbiface.DynamoDBAPI
}

func (m *fakeDynamoDBClient) GetItemRequest(input *dynamodb.GetItemInput) dynamodb.GetItemRequest {
    return dynamodb.GetItemRequest{
        Request: &aws.Request{
            Data: &dynamodb.GetItemOutput{
                Item: map[string]dynamodb.AttributeValue{
                    "count": dynamodb.AttributeValue{
                        N: aws.String("10"),
                    },
                },
            },
        },
    }
}

func (m *fakeDynamoDBClient) PutItemRequest(input *dynamodb.PutItemInput) dynamodb.PutItemRequest {
    return dynamodb.PutItemRequest{
        Request: &aws.Request{
            Data: &dynamodb.PutItemOutput{},
        },
    }
}

func TestUpdateCount(t *testing.T) {
    err := UpdateCount(10, &fakeDynamoDBClient{})
    if err != nil {
        t.Error("Failed to update badge count on dynamodb", err)
    }
}

main.go

代码语言:javascript
复制
func UpdateCount(count int, client dynamodbiface.DynamoDBAPI) error {
    ...
}
票数 2
EN

Stack Overflow用户

发布于 2018-05-16 19:02:56

以您的例子为例,您可以直接在模拟中执行断言。

代码语言:javascript
复制
type mockDynamoDBClient struct {
    t *testing.T
    expected *dynamodb.PutItemInput
    response *dynamodb.PutItemOutput
    dynamodbiface.DynamoDBAPI
}

func (m *mockDynamoDBClient) PutItemRequest(input *dynamodb.PutItemInput) dynamodb.PutItemOutput {
    // some kind of equality check
    if !reflect.DeepEqual(m.expected, input) {
        t.Errorf(...// some error message)
    }
    return m.response
}

这个例子的主要问题是:

t *testing.Texpected *dynamodb.PutItemInput和response response *dynamodb.PutItemOutput都需要在感觉混乱的结构中。

相反,您可以使用一个匿名函数来执行此操作:

代码语言:javascript
复制
type mockDynamoDBClient struct {
    f func(input *dynmaodb.PutItemInput) *dynamodb.PutItemOutput
    dynamodbiface.DynamoDBAPI
}

func (m *mockDynamoDBClient) PutItemRequest(input *dynamodb.PutItemInput) dynamodb.PutItemOutput {
    return m.f(input)
}

现在,在测试代码中,您可以稍微更好地使用模拟结构:

代码语言:javascript
复制
m := &mockDynamoDBClient{
    f: func(input *dynamodb.PutItemInput) *dynamodb.PutItemOutput {
        // assertions on input
        // return mock responses
    }
}

基于评论的编辑

您还应该考虑使MyPutItem函数依赖于最小的接口。如果只需要访问PutItemRequest方法,则可以为该方法创建自己的接口,并在MyPutItem中使用该接口。

代码语言:javascript
复制
type MyDynamoPutter interface {
    func (c *DynamoDB) PutItemRequest(input *PutItemInput) PutItemRequest
}

然后在MyPutItem中,您可以使用自己的接口:

代码语言:javascript
复制
func MyPutItem(d mydata, client MyDynamoPutter) error {
    input := &dynamodb.PutItemInput{
        ....
    }
    req := client.PutItemRequest(input)
    result, err := req.Send()
    log.Println(result)
    return err
}

这减少了你需要模仿的表面积!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50377674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档