如何在 Nodejs 中为 Winston 记录器编写单元测试

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)

我如何修改我的测试?

sli*_*wp2 6

这是单元测试解决方案:

\n\n

logger.js:

\n\n
\'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;\n
Run Code Online (Sandbox Code Playgroud)\n\n

logger.test.js:

\n\n
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\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

源代码:https ://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59388359

\n