如何通过Mongoose向mongo-unit导入含ObjectId的测试数据?
生产JSON数据导入mongo-unit测试环境的查询问题
背景
我有一批从生产数据库导出的JSON数据,用于排查Bug,已存放至test/fixture/data目录。需要将这些数据导入由mongo-unit创建的MongoDB实例中,基于Mongoose 5.10.1版本搭建Node.js应用的单元测试环境。
但始终无法以被测代码可查询的方式导入数据(注:通过Compass将数据导入本地MongoDB服务器时,单元测试可正常运行)。
调研的组合方案
我调研了2种数据加载方式和3种ObjectId处理方式,共6种组合:
基础代码
const my_data = require('./fixture/data/my_data.json'); export default mongoose.model('my_data', TheSchema);
加载方式
await importedSchema.insertMany(my_data, function(err,result) {...});await mongoUnit.load(my_data);(注:使用此方式时,JSON数据需用集合名包裹,格式为{"my_data": [...]})
ObjectId处理方式
"_id": ObjectId("abc...def"),"_id": { "$oid": "abc...def" },"_id": "abc...def",
各组合测试结果
- insertMany()+ObjectId格式:JSON语法错误,提示
Unexpected token 'O' - insertMany()+"$oid"格式:CastError,无法将
{ '$oid': 'xxx' }转换为ObjectId,同时created_date字段也无法转换为日期类型 - insertMany()+字符串格式:
created_date字段转换日期失败 - mongoUnit.load()+ObjectId格式:同insertMany()的JSON语法错误
- mongoUnit.load()+"$oid"格式:MongoBulkWriteError,提示
_id字段不能包含$前缀的字段 - mongoUnit.load()+字符串格式:数据可成功导入,但被测代码查询不到数据。通过mongosh查询发现,用
ObjectId("abc...def")查询无结果,用字符串"abc...def"可查到数据,但被测代码中使用{ "_id": ObjectId(xId) }进行查询,因此查询结果为空。
内容的提问来源于stack exchange,提问作者Stewart
相关产品推荐
相关产品推荐

