我正试图从Jasmine规范中窥探Node.js模块中的依赖项,我遇到了一些奇怪的行为。
Jasmine监视一个方法,该方法驻留在模块中的exports对象公开的对象中。当我使用
调用模块中的spied-on方法时exports.umap()
间谍检测到它。但是当我使用变量名称在模块中调用它时,我将其分配给相同的方法
var umap = exports.umap
umap()
间谍没有发现它。
鉴于var umap引用与exports.umap相同的方法,这对我来说似乎很奇怪。任何人都有任何想法为什么会这样?代码如下。
(我这样做的全部原因是我想要将模块的依赖关系存根,而不需要将模块设计为类并使用依赖注入。)
// mapper.js
exports.umap = require('underscore').map;
var umap = exports.umap;
function map () {
return exports.umap([1,2,3], function(el) {console.log(el);return el * 2});
// umap() goes unnoticed by the spy
// return umap([1,2,3], function(el) {console.log(el);return el * 2});
}
exports.map = map;
// mapper_spec.js
var mapper = require ('../../lib/mapper');
var map = mapper.map;
describe('mapper', function() {
describe('map', function() {
it('calls umap', function() {
var mapped;
spyOn(mapper, 'umap').and.callThrough();
mapped = mapper.map();
expect(mapper.umap).toHaveBeenCalled();
expect(mapped).toEqual([2,4,6]);
});
});
});
更新
我仍然对这个问题感到好奇,但是https://www.npmjs.org/package/proxyquire使我的整个“间谍 - 附加到出口对象”的策略没有实际意义。