如何在NPM Jest中Mock/监视SLF4J Logger?
用Jest测试SLF4J Logger的实现步骤
1. 安装必要依赖
先给项目安装SLF4J的JS实现包和Jest测试工具:
npm install slf4js --save npm install jest --save-dev
如果用TypeScript开发,额外安装类型声明包:
npm install @types/slf4js @types/jest --save-dev
2. 修正原代码的问题
你的原代码存在导出不匹配、未导入Logger的问题,先修正为可运行的版本:
// logfuntest.js // 导入SLF4J并获取Logger实例 const logger = require('slf4js').getLogger('MyLogger'); function someLoggerFunction() { logger.log("some important logs"); } // 导出与定义一致的函数 module.exports = someLoggerFunction;
3. 两种Mock/监视Logger的测试方案
方案一:Mock整个SLF4J模块
直接Mockslf4js模块,让它返回带有Mock方法的Logger实例,测试函数是否正确调用日志方法:
// logfuntest.test.js const someLoggerFunction = require('./logfuntest'); const slf4js = require('slf4js'); // Mock slf4js的getLogger方法,返回带mock log的对象 jest.mock('slf4js', () => ({ getLogger: jest.fn(() => ({ log: jest.fn() })) })); describe('someLoggerFunction', () => { it('调用函数时会触发logger.log并传入正确消息', () => { // 获取mock出来的Logger实例 const mockLogger = slf4js.getLogger.mock.results[0].value; // 执行被测函数 someLoggerFunction(); // 断言log方法的调用情况 expect(mockLogger.log).toHaveBeenCalledTimes(1); expect(mockLogger.log).toHaveBeenCalledWith("some important logs"); }); });
方案二:监视已存在的Logger实例
如果不想Mock整个模块,可以直接监视Logger的log方法:
// logfuntest.test.js const someLoggerFunction = require('./logfuntest'); const logger = require('slf4js').getLogger('MyLogger'); describe('someLoggerFunction', () => { it('调用函数时会触发logger.log并传入正确消息', () => { // 监视log方法,替换为mock实现 const logSpy = jest.spyOn(logger, 'log').mockImplementation(() => {}); // 执行被测函数 someLoggerFunction(); // 断言调用情况 expect(logSpy).toHaveBeenCalledTimes(1); expect(logSpy).toHaveBeenCalledWith("some important logs"); // 恢复原方法,避免影响其他测试用例 logSpy.mockRestore(); }); });
4. 运行测试
在package.json中添加测试脚本:
{ "scripts": { "test": "jest" } }
然后执行命令运行测试:
npm test
内容的提问来源于stack exchange,提问作者Gajendra Kumar Sahu
相关产品推荐
相关产品推荐

