如何用西农存根温斯顿记录器



我有一个利用Winston NodeJs软件包的记录器。记录器执行其他逻辑,我希望进行单元测试以确保将正确的数据传递给温斯顿。但是,由于我已经设置了外部传输(例如 Firehose(,因此不需要调用它们。

我没有通过构造函数将 Winston 作为依赖项传递,但我尝试过存根createLogger方法、log方法和整个 Winston,就像我通常在存根依赖项时所做的那样。

createStubbedInstance方法不适用于 Winston(或者,我无法让它工作(,因为 Winston 不是作为类导出,而是作为命名空间导出。

import { Logger, ILoggerConfig } from './src';
import * as winston from 'winston'
describe('Logger', () => {
let loggerConfig: ILoggerConfig;
let sandbox: sinon.SinonSandbox;
beforeEach(() => {
sandbox = sinon.createSandbox();
loggerConfig = {
correlationId: faker.random.uuid(),
action: 'GET',
};
sandbox = sinon.createSandbox();
winstonStub = sandbox.stub(winston);
winstonStub.createLogger.resolves();
winstonStub.log.resolves();
...
});
it('should log with INFO log level', () => {
const logger = new Logger(loggerConfig);
logger.info('Hello there!');
sinon.assert.calledOnce(winstonStub.log);
sinon.assert.calledWith(winsonStub.log, sinon.match.has("level", 'info'))
});
import { Logger, ILoggerConfig } from './src';
import * as winston from 'winston'
describe('Logger', () => {
let loggerConfig: ILoggerConfig;
let sandbox: sinon.SinonSandbox;
beforeEach(() => {
sandbox = sinon.createSandbox();
loggerConfig = {
correlationId: faker.random.uuid(),
action: 'GET',
};
sandbox = sinon.createSandbox();
winstonStub = sandbox.stub(winston, 'createLogger').resolves({ log: sanbox.stub() });
...
});
it('should log with INFO log level', () => {
const logger = new Logger(loggerConfig);
logger.info('Hello there!');
sinon.assert.calledOnce(winstonStub);
});

我希望能够断言存根将被调用一定次数。但是,存根的呼叫计数始终为 0,并且我收到一个错误,指示由于权限问题,Winston 无法发布到 Firehose。我还设置了控制台传输,并且在不应该看到控制台中的日志时仍然可以看到日志。

由于项目的严格设置导致编译问题的连锁反应,我无法将"esModuleInterop": trueimport winston from 'winston'一起使用。

幸运的是,我找到了一种干净的方法来嘲笑我需要的东西,当嘲笑log直接失败时。

import * as tape from "tape";
import * as sinon from "sinon";
import * as winston from "winston";
tape('Stubbing winston', (test) => {
test.test('Or at least part of it', (test) => {
const logSpy = sinon.spy()
sinon
.stub(winston, "createLogger")
.callsFake(() => ({
log: logSpy,
} as unknown as Logger));
const logger = new MyLoggerThatUsesWinston()
logger.log('Only lost');
logger.log('four hours');
logger.log('on this');
test.equal(logSpy.callCount, 3, "")
test.end();
}
test.end();
}

最新更新