在我的 Golang 项目中,我需要模拟 mongodb 以便能够为我的存储库函数编写单元测试。我主要需要嘲笑
collection.Indexes.CreateMany
或 FindOneAndUpdate
或 Find
或 cursor.All
或 InsertOne
等。据我所知,这是可能的
mtestlib.但我无法模拟创建索引。我需要一些关于如何使用 mtest
(或者是否有更好的选择)在 golang 中模拟 mongo 驱动程序的示例的帮助(尤其是 collection.FindOneAndUpdate
和 collection.Indexes.CreateMany
)
假设你有一个像这样的
MyRepositoryFunction
:
package mypackage
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
)
func MyRepositoryFunction(ctx context.Context, collection *mongo.Collection) error {
models := []mongo.IndexModel{
{Keys: bson.D{{"surname", 1}, {"firstName", 1}}},
{Keys: bson.D{{"key", -1}}},
}
_, err := collection.Indexes().CreateMany(ctx, models)
if err != nil {
return fmt.Errorf("failed to created indexes: %w", err)
}
filter := bson.D{{"_id", "custom123"}}
update := bson.D{{"$set", bson.D{
{"key", 42},
}}}
result := collection.FindOneAndUpdate(ctx, filter, update)
if result.Err() != nil {
return fmt.Errorf("failed to created indexes: %w", result.Err())
}
return nil
}
你可以使用
mtest
,例如:
package mypackage_test
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/integration/mtest"
)
func TestMyRepositoryFunction(t *testing.T) {
ctx := context.Background()
mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
mt.Run("MyRepositoryFunction", func(mt *mtest.T) {
mt.AddMockResponses(
mtest.CreateSuccessResponse(),
mtest.CreateSuccessResponse(bson.E{
"value", bson.M{"_id": "custom123", "key": 24},
}),
)
err := mypackage.MyRepositoryFunction(ctx, mt.Coll)
assert.NoError(t, err, "Should have successfully run")
})
}
您必须知道调用函数的顺序,并以有线格式提供足够的结果以使客户满意。另外,你并没有真正模拟驱动程序 - 这样你就可以模拟服务器。这可能有点困难,因为你必须了解协议。