Jasmine间谍只检测对Node.js导出对象调用的方法的调用

时间:2014-11-27 21:48:11

标签: node.js testing jasmine

我正试图从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使我的整个“间谍 - 附加到出口对象”的策略没有实际意义。

0 个答案:

没有答案