You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang中用mtest模拟mongo.ErrNoDocuments

测试MongoDB FindOne返回ErrNoDocuments分支的实现方法

你编写的CheckExistUser函数中,当MongoDB的FindOne返回mongo.ErrNoDocuments时会返回自定义错误models.ErrAccountNotFound,但现有测试仅覆盖通用错误分支,要覆盖这个分支,你可以通过mtest模拟空游标响应来让FindOne返回ErrNoDocuments,具体实现如下:

目标函数回顾

func CheckExistUser(documentNumber string, mongoClient *mongo.Database) error {
    ctx := context.Background()
    colletionUsersName := "my-collection"

    colletionUsers := mongoClient.Collection(colletionUsersName)
    filter := bson.D{{Key: "cpf", Value: documentNumber}}

    user := &entity.UserEntity{}
    err := colletionUsers.FindOne(ctx, filter).Decode(user)

    if err == mongo.ErrNoDocuments { // 未覆盖的测试分支
        return models.ErrAccountNotFound // 未覆盖的测试分支
    }

    if err != nil {
        return err
    }
    return nil
}

针对ErrNoDocuments分支的测试代码

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

    mt.Run("no documents found", func(mt *mtest.T) {
        // 模拟空游标响应,让FindOne返回ErrNoDocuments
        mt.AddMockResponses(mtest.CreateCursorResponse(0, "my-collection", mtest.FirstBatch))

        documentNumber := "99999999999" // 不存在的文档编号

        err := repository.CheckExistUser(documentNumber, mt.Client.Database("testdb"))
        // 断言返回的是自定义的ErrAccountNotFound
        assert.Equal(t, models.ErrAccountNotFound, err)
    })
}

关键说明

  • mtest.CreateCursorResponse(0, "my-collection", mtest.FirstBatch):创建一个空的游标响应,其中FirstBatch默认是空切片,MongoDB驱动会将这种情况解析为ErrNoDocuments。
  • 测试中使用不存在的文档编号,确保触发目标分支,最后断言返回的错误是你定义的models.ErrAccountNotFound,验证分支逻辑正确性。

内容的提问来源于stack exchange,提问作者Renato Cassino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:42:16