如何让Jest环境下console.assert语句中的%o占位符正常生效
问题原因
Jest 默认会劫持全局 console 方法,且内置的 console.assert 实现未兼容 Node 原生支持的 printf 风格占位符(如 %o、%s、%d 等),会直接将首个字符串参数作为错误信息输出,因此占位符不会被后续参数替换。
解决方案
以下方案任选其一即可:
方案1:手动格式化消息(临时适配)
使用 Node 内置的 util.format 方法提前格式化消息字符串,再传入 console.assert:
const util = require('util'); // 调用示例 console.assert( user_articles.includes(art), util.format("art not in user_articles art: %o", art) );
方案2:全局重写 console.assert(一劳永逸)
在 Jest 的全局初始化文件(通常是 jest.setup.js,需在 jest.config.js 的 setupFilesAfterEnv 配置项中引入)中添加如下代码,统一给 console.assert 增加占位符解析能力:
const util = require('util'); const originalAssert = console.assert; console.assert = function (condition, message, ...args) { if (!condition) { // 先格式化消息再调用原生断言 const formattedMsg = util.format(message, ...args); originalAssert(condition, formattedMsg); } };
方案3:使用 Jest 原生断言(最推荐)
直接替换 console.assert 为 Jest 自带的断言方法,不需要手动处理占位符,Jest 会自动输出清晰的预期值、实际值对比信息:
// 原逻辑等价的Jest断言写法 expect(user_articles).toContain(art);
内容的提问来源于stack exchange,提问作者Peter Gerdes
相关产品推荐
相关产品推荐

