Jasmine test for factory function calling local and another function - getting Error: Expected a spy, but got Function
Jasmine test for factory function calling local and another function - getting Error: Expected a spy, but got Function
我有一个有两个函数和两个本地方法的工厂,我写了一个 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);
}
};
});
我的 Jasmine 测试用例
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();
}));
});
});
你必须先创建间谍才能期待:
it('should save details when saveDetails is called',inject(function(SavePref) {
spyOn(SavePref, "savePref").and.callThrough();
SavePref.saveDetails(values, prop);
expect(SavePref.savePref).toHaveBeenCalled();
}));
如果您想要更新详细信息,则必须进行 public。
在我的示例中,我调用了 .and.callThrough()
,否则永远不会调用实际函数。也许你会想删除它。
我有一个有两个函数和两个本地方法的工厂,我写了一个 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);
}
};
});
我的 Jasmine 测试用例
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();
}));
});
});
你必须先创建间谍才能期待:
it('should save details when saveDetails is called',inject(function(SavePref) {
spyOn(SavePref, "savePref").and.callThrough();
SavePref.saveDetails(values, prop);
expect(SavePref.savePref).toHaveBeenCalled();
}));
如果您想要更新详细信息,则必须进行 public。
在我的示例中,我调用了 .and.callThrough()
,否则永远不会调用实际函数。也许你会想删除它。