Jasmine测试无法匹配函数返回对象属性的问题咨询
控制台输出差异原因
- 拼接字符串显示
[object Object]:JavaScript中对象与字符串拼接时,会自动调用默认的toString()方法,该方法返回固定值"[object Object]",所以执行console.log("Order: " + order)这类代码时会出现这个结果。 - 直接打印order显示完整结构:控制台直接打印对象时,会调用内置的对象格式化工具,能解析并展示对象的所有键值对,因此可以看到真实的属性名和值。
- 打印
order.id显示1:无论属性名是驼峰还是全小写,只要属性存在,通过.直接访问就能获取对应的值,所以这里能正常拿到id。
让测试通过的解决方案
方案1:修改SQL查询,返回驼峰别名
在PostgreSQL的RETURNING语句中给字段指定驼峰别名,注意用双引号包裹别名(PostgreSQL默认会将标识符转为小写)。示例:
INSERT INTO orders (userid, currentstatus) VALUES ($1, $2) RETURNING id, userid AS "userId", currentstatus AS "currentStatus"
这样数据库返回的result.rows[0]属性就是驼峰式,与测试预期一致。
方案2:在JS层手动转换属性名
如果不想修改SQL,可在异步函数中把数据库返回的对象转换成驼峰命名后返回。示例:
async function createOrder(params) { const result = await db.query( 'INSERT INTO orders (userid, currentstatus) VALUES ($1, $2) RETURNING id, userid, currentstatus', [params.userId, params.currentStatus] ); const dbOrder = result.rows[0]; // 手动转换属性名 return { id: dbOrder.id, userId: dbOrder.userid, currentStatus: dbOrder.currentstatus }; }
这种方式简单直接,适合字段固定的场景。
方案3:使用ORM框架自动映射
如果项目允许,引入Sequelize、Prisma等ORM框架,它们默认会将数据库的小写/蛇形字段自动转换为驼峰式JS对象属性,无需手动处理SQL或转换逻辑,能彻底避免这类字段名不匹配的问题。
内容的提问来源于stack exchange,提问作者Abunagy
相关产品推荐
相关产品推荐

