GThree
GThree

Reputation: 3562

Why "Branch" test coverage in Jest shows 0% coverage?

One of my test coverage is as below:

I see total 3 lines: 16, 27 and 38 under uncovered lines. I confirm that by looking at coverage/Icov-report/index.html (WIP for improving unit test).

Would missing 3 lines of coverage cause branch coverage to be 0%? I would expect something rather than 0% but I am learning Jest so not sure.

service.ts

import { injectable } from 'inversify';
import { createLogger, format, Logger } from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';
import fs from 'fs';

const logDir = 'logs';

@injectable()
export default class LoggerService {
  private readonly winstonLogger: Logger;

  private static loggerService: LoggerService;

  constructor() {
    if (!fs.existsSync(logDir)) {
      fs.mkdirSync(logDir);
    }

    const dailyRotateFileTransport = new DailyRotateFile({
      filename: `${logDir}/%DATE%-results.log`,
      datePattern: 'YYYY-MM-DD',
    });

    this.winstonLogger = createLogger({
      format: format.combine(
        format.timestamp(),
        format.printf((info) => `${info.timestamp} ${info.level}: ${JSON.stringify(info.message)}`),
      ),
      transports: [
        dailyRotateFileTransport,
      ],
      exitOnError: false,
    });
  }

  static get Instance() {
    if (this.loggerService) {
      return this.loggerService;
    }
    this.loggerService = new LoggerService();
    return this.loggerService;
  }

  public get logger() {
    return this.winstonLogger;
  }
}

service.spec.ts

const logger = {
  debug: jest.fn(),
  log: jest.fn(),
};

// trying to mock createLogger to return a specific logger instance
jest.mock('winston', () => ({
  format: {
    combine: jest.fn(),
    timestamp: jest.fn(),
    printf: jest.fn(),
  },
  createLogger: jest.fn().mockReturnValue(logger),
  transports: {
    File: jest.fn(),
  },
}));

import 'reflect-metadata';
import * as winston from 'winston';
import LoggerService from '../logger.service';

describe('loggerService', () => {
  let loggerMock: winston.Logger;

  afterAll(() => {
    jest.resetModules();
    jest.resetAllMocks();
  });

  it('logger function called', () => {
    const mockCreateLogger = jest.spyOn(winston, 'createLogger');
    const loggingService: LoggerService = LoggerService.Instance;
    loggerMock = mockCreateLogger.mock.instances[0];
    expect(loggingService).toBeInstanceOf(LoggerService);
    expect(loggingService).toBeDefined();
    expect(mockCreateLogger).toHaveBeenCalled();
    
    logger.log('debug', 'test log debug');
    expect(logger.log).toHaveBeenCalled();

    loggingService.logger.debug('debug message');
    expect(logger.debug).toHaveBeenCalledTimes(1);
  });
});


Upvotes: 1

Views: 5192

Answers (1)

Anatoly
Anatoly

Reputation: 22803

Looks like 0% means you missed testing all ifs that are definitely goes to the category Branch.
Try to add tests for one of ifs and see if % Branch will become something like 50%

Upvotes: 1

Related Questions