mongodb-memory-server搭配Jest测试时_id为ObjectId构造调用问题求解
问题原因说明
这不是mongodb-memory-server的问题:
Mongoose查询和保存操作返回的文档实例中,_id本身就是ObjectId类型的实例,并非原生字符串。Postman调用接口时,Express会在发送响应前自动对Mongoose文档执行JSON序列化,Mongoose内置的toJSON方法会默认把ObjectId实例转换为十六进制字符串,因此你看到的是正常的字符串格式_id。
而在Jest测试场景下,如果你是直接调用控制器方法获取返回值,或者测试工具读取响应体时没有走完整的JSON序列化/反序列化流程,拿到的就是未序列化的原始Mongoose文档对象,因此_id会保留ObjectId实例的形式,打印时就会显示new ObjectId("xxx")的样式。
解决方案
你可以通过以下任意一种方式拿到字符串格式的id用于后续测试:
- 直接调用ObjectId实例的转换方法:使用
_id.toString()或者_id.toHexString()即可直接获取字符串形式的id,示例代码:
const postId = response.body._id.toString(); // 后续测试直接使用postId即可
- 主动对返回的Mongoose文档做序列化:修改控制器的返回逻辑,调用
toJSON()方法后再返回,这样测试和生产环境的返回格式会完全统一:
// 把原代码的res.status(201).send(createdPost);替换为下面的代码 res.status(201).send(createdPost.toJSON());
- 如果你是用supertest等接口测试工具发起请求,只要明确指定接收JSON格式的响应,工具会自动完成序列化处理,返回的响应体里
_id默认就是字符串格式。
内容的提问来源于stack exchange,提问作者Guilherme Raposo
相关产品推荐
相关产品推荐

