我使用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('App is not defined'));
}
glob('./plugins/**/plugin.js', function(err, files) {
if (err) {
return callback(err);
}
pluginInstaller(files, callback, app);
});
};
当没有使用.to.throw(Error)
的应用时,我对该案例进行了测试。
但我不知道如何模拟glob调用。特别是我想告诉我的Test-Method,glob-call返回什么,然后使用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);
});
});
答案 0 :(得分:1)
首先,您需要一个工具,可以挂钩require
函数并更改它返回的内容。我建议proxyquire,然后你可以做一些像:
然后你需要一个实际产生glob函数给出的回调的存根。幸运的是,sinon
已经得到了:
const globMock = sinon.stub().yields();
在一起,你可以这样做:
pluginLoader = proxyquire('../lib/pluginLoader', {
'glob' : globMock
});
现在,当你调用pluginLoader并且它到达glob
- Function时,Sinon将调用参数中的第一个回调。如果您确实需要在该回调中提供一些参数,则可以将它们作为数组传递给te yields
函数,例如yields([arg1, arg2])
。