node.js - nodejs sinon如何存根内联需要来自类的对象
问题描述
我试图存根一个类,它在内联需要行做一些事情。例如,这里假设我正在为 abc-handler.js 编写一个单元测试,它依赖于query-helper
and logger
。另一方面,query-helper
也取决于logger
。但是,我找不到处理存根记录器并将其注入相关依赖项的正确方法。
这是我的一些示例课程。
查询助手.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});
谢谢!
解决方案
我proxyquire
用noCallThru()
.
var proxyquire = require('proxyquire').noCallThru();
在这里解释https://github.com/thlorenz/proxyquire#preventing-call-thru-to-original-dependency
推荐阅读
- reactjs - Webpack css-loader 不解析别名
- mysql - 我可以通过命令行连接到我的远程数据库,但不能从 golang 连接,尽管本地数据库两者都可以正常工作
- c - 尽管声明了临时变量,但如何找出“MIPS 中的地址超出范围”的原因
- video - 如果视频“不可用”,是否有跳过播放列表中的 YouTube 视频的解决方法
- elasticsearch - 使用 Python DSL Elasticsearch UpdateByQuery 单独更新大量文档
- datetime - 在 Ubuntu 18.04 上通过命令行启用/禁用夏令时
- jquery - TypeError:obj.checkValidity 不是函数
- linux - 在 exec_python_func() 中执行 python 函数时出错
- ms-access - MS Access:如何通过单击表单记录来搜索表中的值
- angular - 从代码中手动触发 ngx-sweetalert2