使用Go mongo-driver的mtest模拟UpdateOne时,ModifiedCount始终为0如何解决?
解决mtest模拟MongoDB UpdateOne时ModifiedCount始终为0的问题
你遇到的问题是因为mtest.CreateSuccessResponse生成的响应结构不符合MongoDB驱动对UpdateOne返回结果的解析要求。驱动需要从响应的value子文档中读取nModified字段来填充ModifiedCount,直接传入NModified字段无法被正确解析。
正确的解决方案有两种:
1. 使用专门的mtest.CreateUpdateOneResponse方法
mtest提供了针对UpdateOne的专用响应构造方法,直接传入匹配数和修改数即可:
mt.AddMockResponses(mtest.CreateUpdateOneResponse(1, 1))
第一个参数对应MatchedCount,第二个参数对应ModifiedCount,该方法会自动生成符合驱动解析要求的响应结构。
2. 手动构造符合格式的响应结构
如果需要更自定义的响应,可以手动构造包含value子文档的bson结构:
mt.AddMockResponses(bson.D{ {Key: "ok", Value: 1}, {Key: "value", Value: bson.D{ {Key: "n", Value: 1}, {Key: "nModified", Value: 1}, }}, })
驱动会从value字段下的nModified读取值赋值给updateResult.ModifiedCount,n则对应MatchedCount。
修改后的完整测试代码
func TestUpdateOneCall(t *testing.T) { mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock)) defer mt.Close() mt.Run("Successful Update", func(mt *mtest.T) { mt.AddMockResponses(mtest.CreateUpdateOneResponse(1, 1)) err := UpdateOneCall(mt.Client) assert.Nil(t, err, "Should have successfully triggered update") }) }
修改后updateResult.ModifiedCount会正确返回1,测试即可通过。
内容的提问来源于stack exchange,提问作者Francis Bartkowiak
相关产品推荐
相关产品推荐

