You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:24:04