如何在golang中模拟mongodb驱动

问题描述 投票:0回答:1

在我的 Golang 项目中,我需要模拟 mongodb 以便能够为我的存储库函数编写单元测试。我主要需要嘲笑

collection.Indexes.CreateMany
FindOneAndUpdate
Find
cursor.All
InsertOne
等。据我所知,这是可能的 mtestlib.但我无法模拟创建索引。我需要一些关于如何使用
mtest
(或者是否有更好的选择)在 golang 中模拟 mongo 驱动程序的示例的帮助(尤其是
collection.FindOneAndUpdate
collection.Indexes.CreateMany

mongodb go mocking
1个回答
0
投票

假设你有一个像这样的

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")
    })
}

您必须知道调用函数的顺序,并以有线格式提供足够的结果以使客户满意。另外,你并没有真正模拟驱动程序 - 这样你就可以模拟服务器。这可能有点困难,因为你必须了解协议。

© www.soinside.com 2019 - 2024. All rights reserved.