使用Jasmine间谍来测试函数的调用

时间:2015-02-13 08:34:15

标签: javascript unit-testing testing jasmine

我无法弄清楚如何让Jasmine检查我的测试函数中的函数是否被调用。我知道我必须使用间谍,但我显然不了解间谍的实施,因为它目前无效。

我的功能看起来像这样:

function templates($rootScope, ShareStats) {
    return {
        _writeToStore: function(tmpl, tmplOld) {
            $rootScope.store.templates.save(tmpl);
            if (tmplOld) {
                ShareStats.update(tmpl, tmplOld);
            } else {
                ShareStats.saveAll();
            }
        },
    }
}

我的测试看起来像这样:

describe('Unit: templates', function() {
    var Templates,
        rootScope,
        tmplOld = {...},
        tmplNew = {...};

    beforeEach(function() {
        module('myApp');
        inject(function($injector) {...});
    });

    describe('Templates._writeToStore', function() {
        it('should save object to $rootScope.store.templates', function() {
            var _writeToStore = Templates._writeToStore(tmplNew, tmplOld);
            spyOn(_writeToStore, 'rootScope.store.templates.save');
            _writeToStore(tmplNew, tmplOld);
            expect(rootScope.store.templates.save).toHaveBeenCalled();
        });
        it('should call ShareStats.update() if tmplOld is passed', function() {
            var _writeToStore = Templates._writeToStore(tmplNew, tmplOld);
            spyOn(_writeToStore, 'ShareStats.update');
            _writeToStore(tmplNew, tmplOld);
            expect(ShareStats.update).toHaveBeenCalled();
        });
    });
});

1 个答案:

答案 0 :(得分:1)

你的间谍不太正确。

spyOn(_writeToStore, 'rootScope.store.templates.save');

应该是:

spyOn(rootScope.store.templates, 'save');

即函数所在的对象作为第一个参数,函数名称作为第二个参数。

问题是引用根镜