gpt4 book ai didi

mongodb - 在 Go 中模拟 MongoDB 响应

转载 作者:数据小太阳 更新时间:2023-10-29 03:19:04 26 4
gpt4 key购买 nike

我正在从 MongoDB 获取文档并将其传递给函数 transform,例如

var doc map[string]interface{}
err := collection.FindOne(context.TODO(), filter).Decode(&doc)
result := transform(doc)

我想为 transform 编写单元测试,但我不确定如何模拟来自 MongoDB 的响应。理想情况下,我想设置这样的东西:

func TestTransform(t *testing.T) {
byt := []byte(`
{"hello": "world",
"message": "apple"}
`)

var doc map[string]interface{}

>>> Some method here to Decode byt into doc like the code above <<<

out := transform(doc)
expected := ...
if diff := deep.Equal(expected, out); diff != nil {
t.Error(diff)
}
}

一种方法是将 json.Unmarshal 转换为 doc,但这有时会产生不同的结果。例如,如果 MongoDB 中的文档中有一个数组,那么该数组将被解码为 doc 作为 bson.A 类型而不是 []interface{} 类型。

最佳答案

我团队的一名成员最近发现在 GO 的官方 MongoDB 驱动程序中有一个隐藏的 gem :https://pkg.go.dev/go.mongodb.org/mongo-driver@v1.9.1/mongo/integration/mtest .尽管该包处于实验模式并且不保证向后兼容性,但它可以帮助您执行单元测试,至少对于这个版本的驱动程序是这样。

您可以查看这篇很酷的文章,其中包含大量有关如何使用它的示例:https://medium.com/@victor.neuret/mocking-the-official-mongo-golang-driver-5aad5b226a78 .此外,这里是包含本文代码示例的存储库:https://github.com/victorneuret/mongo-go-driver-mock .

因此,根据您的示例和文章中的示例,我认为您可以尝试如下操作(当然,您可能需要对此进行调整和试验):

func TestTransform(t *testing.T) {
mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
defer mt.Close()

mt.Run("find & transform", func(mt *mtest.T) {
myollection = mt.Coll
expected := myStructure{...}

mt.AddMockResponses(mtest.CreateCursorResponse(1, "foo.bar", mtest.FirstBatch, bson.D{
{"_id", expected.ID},
{"field-1", expected.Field1},
{"field-2", expected.Field2},
}))

response, err := myFindFunction(expected.ID)
if err != nil {
t.Error(err)
}

out := transform(response)
if diff := deep.Equal(expected, out); diff != nil {
t.Error(diff)
}
})
}

或者,您可以通过与 Docker 容器的集成测试以自动化方式执行更真实的测试。有一些很好的软件包可以帮助您解决这个问题:

我在 dockertest 库中遵循这种方法来自动化一个完整的集成测试环境,该环境可以通过 进行 setUptearDown go test -v -run Integration 命令。在此处查看完整示例:https://github.com/AnhellO/learn-dockertest/tree/master/mongo .

希望这对您有所帮助。

关于mongodb - 在 Go 中模拟 MongoDB 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56772452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com