如何在Node.js中模拟glob调用

时间:2015-03-08 13:31:15

标签: node.js unit-testing mocha 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('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);
    });
});

1 个答案:

答案 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])