最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

模拟fs功能与开玩笑

IT培训 admin 7浏览 0评论

模拟fs功能与开玩笑

首先,我是es6jest的新手。

我有一个Logger类实例化winston,我想测试它。

这是我的代码:

const winston = require('winston');
const fs = require('fs');
const path = require('path');
const config = require('../config.json');

class Logger {
  constructor() {
    Logger.createLogDir(Logger.logDir);
    this.logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new (winston.transports.Console)({
          format: winston.formatbine(
            winston.format.colorize({ all: true }),
            winston.format.simple(),
          ),
        }),
        new (winston.transports.File)({
          filename: path.join(Logger.logDir, '/error.log'),
          level: 'error',
        }),
        new (winston.transports.File)({
          filename: path.join(Logger.logDir, '/info.log'),
          level: 'info',
        }),
        new (winston.transports.File)({
          filename: path.join(Logger.logDir, '/combined.log'),
        }),
      ],
    });
  }

  static get logDir() {
    return (config.logDir == null) ? 'log' : config.logDir;
  }

  static createLogDir(logDir) {
    if (!fs.existsSync(logDir)) {
      // Create the directory if it does not exist
      fs.mkdirSync(logDir);
    }
  }
}

exports.logger = new Logger().logger;
export default new Logger();

我想测试我的功能createLogDir()。我的头脑,我认为测试fs.existsSync的状态是个好主意。如果fs.existsSync返回false,必须调用fs.mkdirSync。所以我尝试写一些jest测试:

describe('logDir configuration', () => {
  test('default path must be used', () => {
    const logger = require('./logger');
    jest.mock('fs');
    fs.existsSync = jest.fn();
    fs.existsSync.mockReturnValue(false);
    const mkdirSync = jest.spyOn(logger, 'fs.mkdirSync');
    expect(mkdirSync).toHaveBeenCalled();
  });
});

但是,我有一个错误:

  ● logDir configuration › default path must be used

    Cannot spy the fs.mkdirSync property because it is not a function; undefined given instead

      18 |     fs.existsSync = jest.fn();
      19 |     fs.existsSync.mockReturnValue(true);
    > 20 |     const mkdirSync = jest.spyOn(logger, 'fs.mkdirSync');
      21 |     expect(mkdirSync).toHaveBeenCalled();
      22 |   });
      23 | });

      at ModuleMockerClass.spyOn (node_modules/jest-mock/build/index.js:590:15)
      at Object.test (src/logger.test.js:20:28)

你能帮我调试和测试我的功能吗?

问候。

回答如下:

之所以出现错误,是因为它正在查找fs.mkdirSync对象上名为logger的方法,该方法不存在。如果您在测试中可以访问fs模块,那么您将监视mkdirSync方法,如下所示:

jest.spyOn(fs, 'mkdirSync');

但是,我认为你需要采取不同的方法。

你的createLogDir函数是一个静态方法 - 意味着它只能在类上调用,而不能在该类的实例上调用(new Logger()是类Logger的一个实例)。因此,为了测试该函数,您需要导出类而不是它的实例,即:

module.exports = Logger;

然后你可以进行以下测试:

const Logger = require('./logger');
const fs = require('fs');

jest.mock('fs') // this auto mocks all methods on fs - so you can treat fs.existsSync and fs.mkdirSync like you would jest.fn()

it('should create a new log directory if one doesn\'t already exist', () => {
    // set up existsSync to meet the `if` condition
    fs.existsSync.mockReturnValue(false);

    // call the function that you want to test
    Logger.createLogDir('test-path');

    // make your assertion
    expect(fs.mkdirSync).toHaveBeenCalled();
});

it('should NOT create a new log directory if one already exists', () => {
    // set up existsSync to FAIL the `if` condition
    fs.existsSync.mockReturnValue(true);

    Logger.createLogDir('test-path');

    expect(fs.mkdirSync).not.toHaveBeenCalled();
});

注意:看起来你正在混合CommonJS和es6模块语法(export default是es6) - 我会试着坚持一个或另一个

模拟fs功能与开玩笑

首先,我是es6jest的新手。

我有一个Logger类实例化winston,我想测试它。

这是我的代码:

const winston = require('winston');
const fs = require('fs');
const path = require('path');
const config = require('../config.json');

class Logger {
  constructor() {
    Logger.createLogDir(Logger.logDir);
    this.logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new (winston.transports.Console)({
          format: winston.formatbine(
            winston.format.colorize({ all: true }),
            winston.format.simple(),
          ),
        }),
        new (winston.transports.File)({
          filename: path.join(Logger.logDir, '/error.log'),
          level: 'error',
        }),
        new (winston.transports.File)({
          filename: path.join(Logger.logDir, '/info.log'),
          level: 'info',
        }),
        new (winston.transports.File)({
          filename: path.join(Logger.logDir, '/combined.log'),
        }),
      ],
    });
  }

  static get logDir() {
    return (config.logDir == null) ? 'log' : config.logDir;
  }

  static createLogDir(logDir) {
    if (!fs.existsSync(logDir)) {
      // Create the directory if it does not exist
      fs.mkdirSync(logDir);
    }
  }
}

exports.logger = new Logger().logger;
export default new Logger();

我想测试我的功能createLogDir()。我的头脑,我认为测试fs.existsSync的状态是个好主意。如果fs.existsSync返回false,必须调用fs.mkdirSync。所以我尝试写一些jest测试:

describe('logDir configuration', () => {
  test('default path must be used', () => {
    const logger = require('./logger');
    jest.mock('fs');
    fs.existsSync = jest.fn();
    fs.existsSync.mockReturnValue(false);
    const mkdirSync = jest.spyOn(logger, 'fs.mkdirSync');
    expect(mkdirSync).toHaveBeenCalled();
  });
});

但是,我有一个错误:

  ● logDir configuration › default path must be used

    Cannot spy the fs.mkdirSync property because it is not a function; undefined given instead

      18 |     fs.existsSync = jest.fn();
      19 |     fs.existsSync.mockReturnValue(true);
    > 20 |     const mkdirSync = jest.spyOn(logger, 'fs.mkdirSync');
      21 |     expect(mkdirSync).toHaveBeenCalled();
      22 |   });
      23 | });

      at ModuleMockerClass.spyOn (node_modules/jest-mock/build/index.js:590:15)
      at Object.test (src/logger.test.js:20:28)

你能帮我调试和测试我的功能吗?

问候。

回答如下:

之所以出现错误,是因为它正在查找fs.mkdirSync对象上名为logger的方法,该方法不存在。如果您在测试中可以访问fs模块,那么您将监视mkdirSync方法,如下所示:

jest.spyOn(fs, 'mkdirSync');

但是,我认为你需要采取不同的方法。

你的createLogDir函数是一个静态方法 - 意味着它只能在类上调用,而不能在该类的实例上调用(new Logger()是类Logger的一个实例)。因此,为了测试该函数,您需要导出类而不是它的实例,即:

module.exports = Logger;

然后你可以进行以下测试:

const Logger = require('./logger');
const fs = require('fs');

jest.mock('fs') // this auto mocks all methods on fs - so you can treat fs.existsSync and fs.mkdirSync like you would jest.fn()

it('should create a new log directory if one doesn\'t already exist', () => {
    // set up existsSync to meet the `if` condition
    fs.existsSync.mockReturnValue(false);

    // call the function that you want to test
    Logger.createLogDir('test-path');

    // make your assertion
    expect(fs.mkdirSync).toHaveBeenCalled();
});

it('should NOT create a new log directory if one already exists', () => {
    // set up existsSync to FAIL the `if` condition
    fs.existsSync.mockReturnValue(true);

    Logger.createLogDir('test-path');

    expect(fs.mkdirSync).not.toHaveBeenCalled();
});

注意:看起来你正在混合CommonJS和es6模块语法(export default是es6) - 我会试着坚持一个或另一个

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论