在单元测试中,我想验证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();
但这不起作用。当我进行测试时,摩卡告诉我:
错误:预期0到等于1
我做错了什么,我该如何解决?
PS:我不需要使用Sinon.js,所以如果另一个模块更适合我的情况,其他一切都很好。
答案 0 :(得分:4)
有一个名为proxyquire
的模块,您可以使用该模块覆盖单元测试purpopses的依赖关系:https://npmjs.org/package/proxyquire
您的单元测试可能如下所示:
var proxyquire = require('proxyquire');
var sut = proxyquire('./sut', { 'foo': function(){ /* insert test code here */ });
我不确定这是不是你想要的,但也许你会觉得它很有帮助。
答案 1 :(得分:1)
您可以尝试rewire。它允许您私有访问模块以进行测试。然后,您可以检查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;
}));