如何使用 sinon stub/mock 需要 nodejs 的子模块

How to stub/mock submodules of a require of nodejs using sinon

我正在使用 sinon 对 nodejs(Hapijs) 功能进行单元测试。此函数在 index.js 中。我将 index.js 作为

包含在我的测试文件中
    var index=require('./index.js');

但是在 index.js 里面又是 require

    var library= require('./library.js')

再次 library.js 需要第三方功能

     var googlelib=require('googlelib')

现在当我 运行 我的测试文件 testfunc.js 下面

    var index= require('./index.js');
    var assert = require('assert');
    var sinon = require('sinon');
    var proxyquire= require('proxyquire');

我收到以下错误

    Error: Cannot find module './library'
    at Function.Module._resolveFilename (module.js:555:15)
    at Function.Module._load (module.js:482:25)
    at Module.require (module.js:604:17)
    at require (internal/module.js:11:18)

我想知道是否有任何方法可以对 index.js 的内部 require library.js 进行存根(因为 index.js 中有很多 require 并且 require 中有很多 require)

您可以使用 proxyquire 存根所需的模块,像这样使用它。

const proxyquire = require('proxyquire');

const stubs = {
    './library': (some, argument) => {
        assert.equal(some, 'thing');
        return 'Some ' + argument;
    },
};

const index = proxyquire('./index', stubs);

index();

每当在 index.js 中调用 ./library 时,这将 运行 函数 stubs['./library']

如果 library.js 导出一个带有函数的对象,只需让 stubs 反映出来,并确保按照 index.jslibrary.js 中的名称来命名它们。

const stubs = {
    './library': {
        more: (argument) => {},
        methods: (argument) => {},
    },
};

阅读文档了解更多信息。将其与 Mocha or Jasmine.

等测试框架结合使用

此外,您得到的错误似乎不是来自您的测试文件,而是来自您的索引文件。这回答了您的问题,但您可能想查看导致错误的原因,或者更确切地说,为什么 index.js 找不到 library.js。确保它们在同一个文件夹中。