如何使用 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.js
和 library.js
中的名称来命名它们。
const stubs = {
'./library': {
more: (argument) => {},
methods: (argument) => {},
},
};
阅读文档了解更多信息。将其与 Mocha or Jasmine.
等测试框架结合使用
此外,您得到的错误似乎不是来自您的测试文件,而是来自您的索引文件。这回答了您的问题,但您可能想查看导致错误的原因,或者更确切地说,为什么 index.js
找不到 library.js
。确保它们在同一个文件夹中。
我正在使用 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.js
和 library.js
中的名称来命名它们。
const stubs = {
'./library': {
more: (argument) => {},
methods: (argument) => {},
},
};
阅读文档了解更多信息。将其与 Mocha or Jasmine.
等测试框架结合使用此外,您得到的错误似乎不是来自您的测试文件,而是来自您的索引文件。这回答了您的问题,但您可能想查看导致错误的原因,或者更确切地说,为什么 index.js
找不到 library.js
。确保它们在同一个文件夹中。