我刚刚开始学习angularjs的Jasmine测试用例。我无法测试下面的代码。亲自帮助
$scope.getConstants = function(lovName) {
ConstantService.getConstants(lovName).then(function(d) {
switch (lovName) {
case 'WORKFLOW':
$scope.workflowTypes = d;
$scope.loadCounterpartyTmp();
break;
--------Other Cases
}
我的ConstantService定义为
App.factory('ConstantService', [ '$http', '$q', function($http, $q) {
return {
getConstants : function(lovName) {
return $http.post('/sdwt/data/getConstants/', lovName).then(function(response) {
return response.data;
}, function(errResponse) {
return $q.reject(errResponse);
});
}
我想测试getConstants函数。我需要创建一个ConstantService模拟器并将数据传递给它。
我在下面写了测试用例,但是测试用例没有用。请让我知道如何测试上面的代码
describe('getConstantsForMurexEntity', function() {
it('testing getConstantsForMurexEntity function', function() {
var d=[];
d.push(
{id:1,value:'ABC'},
{id:2,value:'DEF'},
{id:3,value:'IJK'},
{id:4,value:'XYZ'},
);
//defined controller
spyOn(ConstantService, 'getConstants').and.returnValue(d);
$scope.getConstants('WORKFLOW');
expect($scope.workflowTypes).toBe(d);
上面的测试用例没有工作,因为它说" ConstantService.getConstants(...)。那么它不是一个函数"。
答案 0 :(得分:1)
您的ConstantService.getConstants()
函数会通过.then()
调用返回您的实际代码正在使用的承诺。这意味着当你监视它时,你还需要返回一个你没有做的承诺。因为您没有返回承诺,当您的实际调用尝试调用.then()
时,它是未定义的,这是错误消息的原因。
另外,您没有正确使用Array.push
。
您的测试应该类似于以下内容(注意,这是未经测试的):
describe('getConstantsForMurexEntity', function() {
it('should set workflowTypes to the resolved value when lovName is "WORKFLOW"', inject(function($q) {
var deferred = $q.defer();
spyOn(ConstantService, 'getConstants').and.returnValue(deferred.promise);
var d = [
{id:1,value:'ABC'},
{id:2,value:'DEF'},
{id:3,value:'IJK'},
{id:4,value:'XYZ'},
];
$scope.getConstants('WORKFLOW');
deferred.resolve(d);
$scope.$apply();
expect($scope.workflowTypes).toBe(d);
}));
});