如何在Node.js中模拟glob调用
我正在使用Mocha、Chai和Sinon JS为Node.JS应用程序编写单元测试 以下是我要测试的模块:如何在Node.js中模拟glob调用,node.js,unit-testing,mocha.js,sinon,chai,Node.js,Unit Testing,Mocha.js,Sinon,Chai,我正在使用Mocha、Chai和Sinon JS为Node.JS应用程序编写单元测试 以下是我要测试的模块: var glob = require('glob'); var pluginInstaller = require('./pluginInstaller'); module.exports = function(app, callback) { 'use strict'; if (!app) { return callback(new Error('A
var glob = require('glob');
var pluginInstaller = require('./pluginInstaller');
module.exports = function(app, callback) {
'use strict';
if (!app) {
return callback(new Error('App is not defined'));
}
glob('./plugins/**/plugin.js', function(err, files) {
if (err) {
return callback(err);
}
pluginInstaller(files, callback, app);
});
};
当没有应用程序使用.to.throw(Error)
时,我对这个案例进行了测试
但我不知道如何嘲笑全球电话。我特别想告诉我的测试方法,glob调用返回什么,然后使用sinon.spy
检查是否调用了pluginInstaller
这是我迄今为止的测试:
var expect = require('chai').expect,
pluginLoader = require('../lib/pluginLoader');
describe('loading the plugins', function() {
'use strict';
it ('returns an error with no app', function() {
expect(function() {
pluginLoader(null);
}).to.throw(Error);
});
});
首先,您需要一个工具,让您能够钩住
require
函数并更改它返回的内容。我建议,然后你可以做一些事情,比如:
然后,您需要一个存根,该存根实际生成给定到glob函数中的回调。幸运的是,sinon
已经得到了:
const globMock = sinon.stub().yields();
一起,您可以像这样做:
pluginLoader = proxyquire('../lib/pluginLoader', {
'glob' : globMock
});
现在,当您调用pluginLoader并到达
glob
-函数时,Sinon将调用参数中的第一个回调。如果您确实需要在回调中提供一些参数,您可以将它们作为数组传递给teyields
函数,就像yields([arg1,arg2])
这很有效,谢谢!当blob返回错误时,我还尝试测试这个案例。我发现,我可以分配什么var globMock=sinon.stub().throws()
在调用时引发异常。但是有了这个,我的回调就不会被调用了。你有什么想法,我怎么能期望mock模块返回一个错误?正如我写的,你可以把参数传递给CB函数。例如:产生([newerror()])
。