An *_*mar 6 node.js winston jestjs
我正在使用 winston logger 在 Nodejs 中编写一个日志框架。现在我必须编写单元测试来使用笑话测试我的类。
下面是我的 LoggerClass:
'use strict';
const { createLogger, format, transports } = require('winston');
const fs = require('fs');
const env = process.env.NODE_ENV || 'development';
const logger = createLogger({
level: env === 'development' ? 'debug' : 'info',
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)),
transports: [
new transports.Console({
level: 'info',
format: format.combine(
format.printf(
info => `${info.level}: ${info.message}`
)
)
}),
new transports.File({ filename })
]
});
module.exports = logger;
Run Code Online (Sandbox Code Playgroud)
我将测试编写为:
'use strict';
const { createLogger, format, transports } = require('winston');
const fs = require('fs');
const env = process.env.NODE_ENV || 'development';
const logger = createLogger({
level: env === 'development' ? 'debug' : 'info',
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)),
transports: [
new transports.Console({
level: 'info',
format: format.combine(
format.printf(
info => `${info.level}: ${info.message}`
)
)
}),
new transports.File({ filename })
]
});
module.exports = logger;
Run Code Online (Sandbox Code Playgroud)
我如何修改我的测试?
这是单元测试解决方案:
\n\nlogger.js:
\'use strict\';\n\nconst { createLogger, format, transports } = require(\'winston\');\n\nconst env = process.env.NODE_ENV || \'development\';\nconst filename = \'filename\';\n\nconst logger = createLogger({\n level: env === \'development\' ? \'debug\' : \'info\',\n format: format.combine(\n format.timestamp({\n format: \'YYYY-MM-DD HH:mm:ss\',\n }),\n format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`),\n ),\n transports: [\n new transports.Console({\n level: \'info\',\n format: format.combine(format.printf((info) => `${info.level}: ${info.message}`)),\n }),\n new transports.File({ filename }),\n ],\n});\n\nmodule.exports = logger;\nRun Code Online (Sandbox Code Playgroud)\n\nlogger.test.js:
jest.mock(\'winston\', () => {\n const mFormat = {\n combine: jest.fn(),\n timestamp: jest.fn(),\n printf: jest.fn(),\n };\n const mTransports = {\n Console: jest.fn(),\n File: jest.fn(),\n };\n const mLogger = {\n info: jest.fn(),\n };\n return {\n format: mFormat,\n transports: mTransports,\n createLogger: jest.fn(() => mLogger),\n };\n});\nconst { createLogger, format, transports } = require(\'winston\');\n\ndescribe(\'logger\', () => {\n afterEach(() => {\n jest.resetAllMocks();\n });\n it(\'should pass\', () => {\n let templateFunctions = [];\n format.printf.mockImplementation((templateFn) => {\n templateFunctions.push(templateFn);\n });\n const logger = require(\'./logger\');\n logger.info(\'Hello world\');\n const info = {\n timestamp: 123,\n level: \'info\',\n message: \'haha\',\n };\n const tFn1 = templateFunctions.shift();\n expect(tFn1(info)).toBe(`${info.timestamp} ${info.level}: ${info.message}`);\n const tFn2 = templateFunctions.shift();\n expect(tFn2(info)).toBe(`${info.level}: ${info.message}`);\n expect(format.combine).toBeCalledTimes(2);\n expect(format.timestamp).toBeCalledWith({ format: \'YYYY-MM-DD HH:mm:ss\' });\n expect(format.printf).toBeCalledWith(expect.any(Function));\n expect(transports.Console).toBeCalledTimes(1);\n expect(transports.File).toBeCalledWith({ filename: \'filename\' });\n expect(createLogger).toBeCalledTimes(1);\n });\n});\n\nRun Code Online (Sandbox Code Playgroud)\n\n带有覆盖率报告的单元测试结果:
\n\n PASS src/stackoverflow/59388359/logger.test.js (10.484s)\n logger\n \xe2\x9c\x93 should pass (10ms)\n\n-----------|----------|----------|----------|----------|-------------------|\nFile | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |\n-----------|----------|----------|----------|----------|-------------------|\nAll files | 100 | 50 | 100 | 100 | |\n logger.js | 100 | 50 | 100 | 100 | 5,9 |\n-----------|----------|----------|----------|----------|-------------------|\nTest Suites: 1 passed, 1 total\nTests: 1 passed, 1 total\nSnapshots: 0 total\nTime: 11.789s\nRun Code Online (Sandbox Code Playgroud)\n\n源代码:https ://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59388359
\n| 归档时间: |
|
| 查看次数: |
9007 次 |
| 最近记录: |