Go mongo-driver mtest中FindOne无法按过滤器返回正确结果
问题排查与解决方案
针对你遇到的mtest模拟时FindOne总是返回第一条结果的问题,核心原因是mtest默认不会自动匹配查询过滤器,需要显式为不同的过滤器预设对应的响应,结合你的版本环境,具体排查点和解决方法如下:
未绑定过滤器到预设响应
如果你只是直接添加批量响应,比如:mtest.AddMockResponses(bson.D{ {"ok", 1}, {"cursor", bson.D{ {"firstBatch", bson.A{org1, org2, org3}}, }}, })这种情况下mtest会按顺序返回预设文档,FindOne会直接取第一个元素org1,完全忽略传入的过滤器。你需要为每个需要匹配的过滤器单独设置响应。
使用带过滤器匹配的Mock响应
用mtest.CreateCommandResponse结合WithFilter选项,为特定过滤器绑定对应的返回结果。示例代码:// 预设org1的匹配响应 filterOrg1 := bson.D{{"_id", org1.ID}} respOrg1 := mtest.CreateFindOneResponse( mtest.CreateCursorResponse(1, "test.orgs", mtest.FirstBatch, org1), ) mtest.AddMockResponse(mtest.CreateCommandResponse(respOrg1, mtest.WithFilter(filterOrg1))) // 预设org2的匹配响应 filterOrg2 := bson.D{{"_id", org2.ID}} respOrg2 := mtest.CreateFindOneResponse( mtest.CreateCursorResponse(1, "test.orgs", mtest.FirstBatch, org2), ) mtest.AddMockResponse(mtest.CreateCommandResponse(respOrg2, mtest.WithFilter(filterOrg2)))这样当GetOrg传入对应过滤器时,mtest会返回匹配的文档,而不是默认第一条。
确保过滤器结构完全一致
在go.mongodb.org/mongo-driver v1.5.4版本中,mtest的过滤器匹配是精确结构匹配。如果你的业务代码中用bson.M构造过滤器,但mtest预设时用了bson.D,会导致匹配失败,进而返回默认的第一条结果。要保证代码和测试中使用的bson结构完全相同(统一用bson.D或bson.M)。验证FindOne的过滤器传递
虽然实际运行正常,但可以在测试中打印出GetOrg函数传递给FindOne的过滤器内容,确认是否和你预设的匹配条件一致,排除代码中过滤器被意外修改的情况。
内容的提问来源于stack exchange,提问作者simkusr
相关产品推荐
相关产品推荐

