Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Node.js中监视require_Javascript_Node.js_Unit Testing_Mocha.js_Sinon - Fatal编程技术网

Javascript 在Node.js中监视require

Javascript 在Node.js中监视require,javascript,node.js,unit-testing,mocha.js,sinon,Javascript,Node.js,Unit Testing,Mocha.js,Sinon,在单元测试中,我想验证SUT是否使用特定参数调用require。基本上,我的SUT是一个具有以下实现的小模块: module.exports = function () { require('foo'); }; 我现在想写一个这样的测试: var sut = require('./sut'); it('requires foo.', function () { sut(); expect( ??? ); }); 所以问题是:如何验证是否使用正确的参数调用了require?我用一个

在单元测试中,我想验证SUT是否使用特定参数调用
require
。基本上,我的SUT是一个具有以下实现的小模块:

module.exports = function () {
  require('foo');
};
我现在想写一个这样的测试:

var sut = require('./sut');
it('requires foo.', function () {
  sut();
  expect( ??? );
});
所以问题是:如何验证是否使用正确的参数调用了
require
?我用一个Sinon.js间谍试过了:

var spy = sinon.spy(require);
sut();
expect(spy.callCount).to.be.equal(1);
expect(spy.calledWithExactly('foo')).to.be(true);
require.restore();
但这不起作用。当我运行测试时,Mocha告诉我:

错误:0应等于1

我做错了什么?我该如何修复它


PS:我不需要使用Sinon.js,因此如果另一个模块更适合我的情况,其他一切都可以。

有一个名为
proxyquire
的模块,您可以使用它覆盖单元测试目的的依赖项:

然后,您的单元测试可能如下所示:

var proxyquire =  require('proxyquire');

var sut = proxyquire('./sut', { 'foo': function(){ /* insert test code here */ });
我不确定这是否正是你想要的,但也许你会发现它很有用。

你可以试试。它允许您出于测试目的对模块进行私有访问。然后可以检查
module.children
-变量以检查依赖性

如果您想检查模块
a.js
是否需要
b.js
,它看起来会像:

var rewire = require("rewire");
var a = rewire("./a.js"); // using rewire instead of require

var pathToB = require.resolve("./b.js");
var aModule = a.__get__("module"); // leaking the private module-variable

assert.ok(aModule.children.some(function (module) {
    return module.filename === pathToB;
}));

我刚刚发现
b.js
不应该在
require.cache
中,否则它不会出现在
子数组中。如果
require(“/b.js”)
在模块启动时没有发生,您可以通过
a注入您自己的
require()
proxyquire如果我一直都想要,那就太好了——但我只需要一次测试。不幸的是,对于proxyquire,我无法为每个测试重新配置它。因此,这是一个很好的提示,但与我的场景不匹配。