Как заглушить Winston logger с помощью sinon - PullRequest
0 голосов
/ 15 октября 2019

У меня есть регистратор, который использует пакет Winston NodeJs. Регистратор выполняет дополнительную логику, и я хотел бы провести модульные тесты, чтобы убедиться, что правильные данные передаются в Winston. Однако, поскольку я настроил внешние транспорты (например, Firehose), мне не нужно их вызывать.

Я не передаю Winston как зависимость через конструктор, но я попытался указать createLogger method, метод 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, и я получаю сообщение об ошибке, указывающее, что Уинстон не может отправлять сообщения в Firehose из-за проблем с разрешениями. У меня также настроен транспорт консоли, и я по-прежнему вижу журналы в консоли, когда не должен.

...