工厂函数调用local和另一个函数的Jasmine测试 - 获取错误:期望一个间谍,但得到了函数

时间:2015-03-23 13:32:03

标签: javascript angularjs junit jasmine

我有一个工厂,它有两个函数和两个本地方法,我写了一个jasmine测试用例,其中一种方式,当调用SavePref.saveDetails(values, prop);时,我需要期望本地方法updateDetails因为工厂函数SavePref.savePref已被调用,如下所示

        SavePref.saveDetails(values, prop);
        expect(updateDetails).toHaveBeenCalled();
        expect(SavePref.savePref).toHaveBeenCalled();

但问题是当我运行测试用例时,我正在

Error: Expected a spy, but got Function.

任何人都可以告诉我一些解决方案吗

我的工厂如下所示

 app.factory('SavePref', function($rootScope, Restangular) {

            updateFiles = function(prop) {
                if (!prop.found) {
                    _.merge(prop.oldFiles, prop.newFiles);
                }
            };

            updateDetails = function(values, newProp) {
                angular.forEach(values, function(value, index) {
                    newProp.found = false;
                    newProp.datas = value.datas;
                    updateFiles(newProp);
                });
            };

            return {

                savePref: function(newProp) {
                    Restangular.all('rest/savePref').post(newProp).then(function(response) {
                        $rootScope.success = true;
                    }, function(errorResponse) {});
                },

                saveDetails: function(values, prop) {
                    var newProp = {};
                    newProp.values= prop.values;
                    newProp.oldFiles = prop.oldFiles;
                    newProp.newFiles = prop.newFiles;
                    updateDetails(values, newProp);
                    this.savePref(newProp);
                }
            };
        });

我的茉莉花测试案例

describe('Service: SavePref', function(SavePref) {
    beforeEach(module('com'));

    var httpBackend;
    var RestangularMock;

    var values;

    beforeEach(function() {
        values = {
            datas: {
                file1: 'Test1',
                file2: 'Test2',
                file3: 'Test3'
            }
        };
        prop = {
            oldFiles: 'sampleFile1',
            newFiles: 'sampleFile2',
            values: {}
        };

        module(function($provide) {
            $provide.value('prop', prop);
        });
    });

    describe('Testing saveDetails Functions', function() {
        it('should save details when saveDetails is called', inject(function(SavePref) {

            SavePref.saveDetails(values, prop);
            expect(updateDetails).toHaveBeenCalled();
            expect(SavePref.savePref).toHaveBeenCalled();
        }));
    });
});

1 个答案:

答案 0 :(得分:1)

你必须首先创建间谍以期望:

it('should save details when saveDetails is called',inject(function(SavePref) {

        spyOn(SavePref, "savePref").and.callThrough();
        SavePref.saveDetails(values, prop);
        expect(SavePref.savePref).toHaveBeenCalled();
    }));

如果您希望更新updateDetails,则必须将其公开。

在我的例子中,我打电话给.and.callThrough(),否则永远不会对实际功能进行调用。也许你会想删除它。