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

如何在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

我正在使用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调用返回什么,然后使用
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将调用参数中的第一个回调。如果您确实需要在回调中提供一些参数,您可以将它们作为数组传递给te
yields
函数,就像
yields([arg1,arg2])

这很有效,谢谢!当blob返回错误时,我还尝试测试这个案例。我发现,我可以分配什么
var globMock=sinon.stub().throws()
在调用时引发异常。但是有了这个,我的回调就不会被调用了。你有什么想法,我怎么能期望mock模块返回一个错误?正如我写的,你可以把参数传递给CB函数。例如:
产生([newerror()])