在Go语言中将json解组到strike时,s3/sqs事件的单元测试用例可能是什么?

disho6za  于 2022-12-24  发布在  Go
关注(0)|答案(1)|浏览(109)

当在Go语言中将json解组到strike时,s3/sqs事件的单元测试用例是什么?
想到的一个选择是,如果"身体"是空的,但不确定它还能是什么。
代码示例:

type Event struct {
    Message string `json:"Message"`
}

func unmarshal(message events.SQSMessage) (s3Event, error) {

        var e Event
        err := json.Unmarshal([]byte(message.Body), &e)
        if err != nil {
            return s3Event, err
        }

        var s3Event events.S3Event
        err = json.Unmarshal([]byte(e.Message), &sqsEvent)
        if err != nil {
            return s3Event, err
        }
        return s3Event, nil

}

会很感激你的建议。

szqfcxe2

szqfcxe21#

前提:我不确定我是否完全理解了你的问题。此外,代码有一些问题,让我很难弄清楚发生了什么。尽管如此,我将尝试通过提供一个工作软件(它不是很有用)和一个只是为了测试它而编写的软件来帮助你。也许,这可以帮助你弄清楚你的问题。

unmarshal.go文件
package unmarshaltest

import (
    "encoding/json"
    "fmt"

    "github.com/aws/aws-lambda-go/events"
)

type Event struct {
    Message string `json:"body"`
}

func Unmarshal(message events.SQSMessage) (string, error) {
    rawBytes, _ := json.Marshal(message)
    var e Event
    json.Unmarshal(rawBytes, &e)
    if e.Message == "" {
        return "", fmt.Errorf("err while unmarshaling")
    }
    return e.Message, nil
}

我修正了一件事,你应该注意的是你如何命名你的函数。如果你用小写的u来调用你的函数unmarshal,这意味着这个函数不应该从这个包中导出(它是私有的)。所以我用U来修改名字,因为我认为你想测试这个函数。

unmarshal_test.go文件
package unmarshaltest

import (
    "encoding/json"
    "testing"

    "github.com/aws/aws-lambda-go/events"
    "github.com/stretchr/testify/assert"
)

func TestUnmarshal(t *testing.T) {
    t.Run("Unmarshal_NotEmpty_Message", func(t *testing.T) {
        var sqsMsg events.SQSMessage
        sqsEventRaw := `{ "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", "receiptHandle": "MessageReceiptHandle", "body": "My own event payload!", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1523232000000", "SenderId": "123456789012", "ApproximateFirstReceiveTimestamp": "1523232000001" }, "messageAttributes": {}, "md5OfBody": "4d1d0024b51659ad8c3725f9ba7e2471", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:MyQueue", "awsRegion": "us-east-1" }`
        json.Unmarshal([]byte(sqsEventRaw), &sqsMsg)
        res, err := Unmarshal(sqsMsg)
        assert.Equal(t, "My own event payload!", res)
        assert.Nil(t, err)
    })

    t.Run("Unmarshal_Empty_Message", func(t *testing.T) {
        res, err := Unmarshal(events.SQSMessage{})
        assert.Equal(t, "", res)
        assert.NotNil(t, err)
    })
}

在这里,您可以找到一段简单的代码,用于测试我们的代码可能采用的两种可能的执行流。
你还应该注意你如何写代码。很难用模拟来替换对json.Unmarshal函数的调用,因为它是硬编码到代码中的。如果你希望能够模拟这个函数,你应该依赖于你的产品代码中的接口,并在测试期间用模拟来替换它们。如果这澄清了一些事情,如果你需要其他的东西,请告诉我!

相关问题