【问题标题】:nodejs sinon how to stub inline require object from a classnodejs sinon如何存根内联需要来自类的对象
【发布时间】:2018-10-11 04:39:17
【问题描述】:

我正在尝试存根一个类,该类在 inline require 行中执行一些操作。例如,假设我正在为 abc-handler.js 编写一个单元测试,它依赖于 query-helperlogger。另一方面,query-helper 也依赖于logger。但是,我找不到处理存根记录器并将其注入相关依赖项的正确方法。

这是我的一些示例类。

query-helper.js

var logger = require('./log/logger.js').getDefaultLogger();

class QueryHelper {
  static save() {
    // save stuff
  }
}

abc-handler.js

const logger = require('./log/logger.js').getDefaultLogger();
const QueryHelper = require('./query-helper.js');
var Handler = require('./handler.js');

/**
    Handler for 'binance' exchange
*/
class ABCHandler extends Handler {
    constructor(params) {
        super(params);
    }

    doStuff() {}
}

logger.js

var Log = require('log');
var fs = require('fs');
var dir = './logs';
const config = require('./config.js');
class LoggerFactory {
    static getDefaultLogger() {
        this._createDir();
        if (this.logger === null || this.logger === undefined) {
            this.logger = new Logger("application");
        }
        return this.logger;
    }

    static _createDir() {
        if (!fs.existsSync(dir)) {
            fs.mkdirSync(dir);
        }
    }
}

class Logger {
    constructor(operationType) {
        this.logger = new Log("debug", fs.createWriteStream("logs/" + operationType + ".log"), {flags: "a"});
    }
}

module.exports = LoggerFactory;

这是来自单元测试的示例块。这里 abcHandler 创建了不应该发生的 ./log 目录,因为我正在传递 loggerStub

var sinon = require('sinon');
var proxyquire = require('proxyquire');
var Log = require('log');
...

logger = proxyquire('./logger.js', {'./config.js': config});
loggerStub = sinon.createStubInstance(Log);
_createDirStub = sinon.stub(logger, "getDefaultLogger").returns(loggerStub);

queryHelper = proxyquire('./query-helper.js' , {'./logger.js': logger});
queryHelperGetLastDataStub = sinon.stub(queryHelper, "save");

abcHandler = proxyquire('.abc-handler.js'
                                    , {'./logger.js': logger,
                                        './query-helper.js': queryHelper,
                                        './config.js': config});

谢谢!

【问题讨论】:

    标签: node.js unit-testing sinon stub stubbing


    【解决方案1】:

    我用noCallThru()解决了这个初始化proxyquire的问题。

    var proxyquire = require('proxyquire').noCallThru();
    

    在这里解释https://github.com/thlorenz/proxyquire#preventing-call-thru-to-original-dependency

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 2019-09-12
      • 2018-06-15
      • 2019-01-28
      • 1970-01-01
      • 2019-12-19
      • 2018-09-16
      • 2023-01-18
      相关资源
      最近更新 更多