如何在 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]).