如何在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
相关产品推荐
相关产品推荐

