如何在 Node.js 中模拟 glob 调用
How to mock a glob call in Node.js
我正在使用 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 调用。特别是我想告诉我的测试方法,glob-call returns 是什么,然后检查是否已调用 pluginInstaller,使用 sinon.spy
.
这是我目前的测试:
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
函数并更改它的内容 returns。我建议 proxyquire,然后你可以这样做:
那么您需要一个存根,它实际产生给 glob 函数的回调。幸运的是,sinon
已经知道了:
const globMock = sinon.stub().yields();
在一起,你可以这样做:
pluginLoader = proxyquire('../lib/pluginLoader', {
'glob' : globMock
});
现在,当您调用 pluginLoader 并到达 glob
-Function 时,Sinon 将调用参数中的第一个回调。如果您确实需要在该回调中提供一些参数,您可以将它们作为数组传递给 te yields
函数,例如 yields([arg1, arg2])
.
我正在使用 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 调用。特别是我想告诉我的测试方法,glob-call returns 是什么,然后检查是否已调用 pluginInstaller,使用 sinon.spy
.
这是我目前的测试:
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
函数并更改它的内容 returns。我建议 proxyquire,然后你可以这样做:
那么您需要一个存根,它实际产生给 glob 函数的回调。幸运的是,sinon
已经知道了:
const globMock = sinon.stub().yields();
在一起,你可以这样做:
pluginLoader = proxyquire('../lib/pluginLoader', {
'glob' : globMock
});
现在,当您调用 pluginLoader 并到达 glob
-Function 时,Sinon 将调用参数中的第一个回调。如果您确实需要在该回调中提供一些参数,您可以将它们作为数组传递给 te yields
函数,例如 yields([arg1, arg2])
.