2016-09-22 92 views
1

我想测试范围函数,它将检查到期金额,但在运行测试时,我得到validateAmount is not a functionkarma测试返回validateAmount不是函数

app.js

var ManagmentApp = angular.module("ManagemntApp", ['ngRoute', 'angularModalService', 'ng-fusioncharts']); 
ManagmentApp.config(['$routeProvider', function ($routeProvider){ 
    $routeProvider.when('/', { 
     templateUrl: 'templates/CandidateForm.html', 
     controller: 'cntrlrCandidate' 
    }).when('/CandidateList',{ 
      templateUrl: 'templates/CandidateList.html', 
      controller: 'cntrlrCandidateList' 
    }).when('/CandidatesProfile', { 
     templateUrl: 'templates/CandidateProfiles.html', 
     controller: 'cntrlrCandidateProfile' 
    }).when('/HostelStatistics', { 
     templateUrl: 'templates/HostelStatistics.html', 
     controller: 'cntrlHostelStatistics' 
    }).when('/:id', { 
     templateUrl: 'templates/CandidateForm.html', 
     controller: 'cntrlrCandidate' 
    }); 

}]); 

cntrlrCandidate.js

ManagmentApp.controller("cntrlrCandidate", ["$scope", "$routeParams", "HostelManagementService", "$filter","HostelManagementIndexDBService", function ($scope, $routeParams, HostelManagementService, $filter,HostelManagementIndexDBService) { 

    $scope.validateAmount = function() { 
    var vrAmount = $scope.Candidate.Amount; 
    var vrTotalAmount = $scope.PerMonthCharge; 
    if (+vrAmount < +vrTotalAmount) { 
     $scope.IsValidAmount = false; 
     $scope.Candidate.DueAmount = (+vrTotalAmount - +vrAmount); 

    } else { 

     $scope.IsValidAmount = true; 
     $scope.Candidate.DueAmount = 0;    
    } 
} 


}]); 

test.js

describe("ManagemntApp ", function() { 

beforeEach(module('ManagemntApp')); 
var scope; 
var cntrlrCandidate, 
$location; 

beforeEach(inject(function ($controller,$rootScope){ 
    scope = $rootScope.$new(); 
    cntrlrCandidate = function() { 
      return $controller('cntrlrCandidate', { 
       '$scope': scope 
      }); 
     };; 
})); 


    it('test amount', function() { 

    scope.Candidate={}; 
    scope.Candidate.Amount=2000; 
    scope.validateAmount(); 
     expect(scope.IsValidAmount).toEqual(true); 
    }); 


}); 

我想不出什么做通知。

这是我得到的错误。 TestError

UPDATE1:

当我写了这样的错误信息如下。

beforeEach(inject(function ($controller,$rootScope){ 
    scope = $rootScope.$new(); 
// cntrlrCandidate = function() { 
      cntrlrCandidate= $controller('cntrlrCandidate', { 
       '$scope': scope 
      }); 
     // };; 
})); 

请检查这个错误:enter image description here

更新2:

我试过这种方式,请纠正我,如果我做错了什么。

describe("ManagemntApp ", function() { 
var HostelManagementIndexDBService,HostelManagementService; 
beforeEach(module('ManagemntApp')); 
var scope; 
var cntrlrCandidate, 
$location; 

beforeEach(inject(function ($controller,$rootScope){ 
    scope = $rootScope.$new(); 
// cntrlrCandidate = function() { 
    HostelManagementService = {}; 
    HostelManagementIndexDBService = {}; 
    module(function($provide) { 
    $provide.value('HostelManagementService', HostelManagementService); 
    $provide.value('HostelManagementIndexDBService', HostelManagementIndexDBService); 
    }); 

    cntrlrCandidate= $controller('cntrlrCandidate', { 
       '$scope': scope 
      }); 
     // };; 
})); 


    it('return will pass the Amount', function() { 

    scope.Candidate={}; 
    scope.Candidate.Amount=2000; 
    scope.validateAmount(); 
     expect(scope.IsValidAmount).toEqual(true); 
    }); 


}); 
+0

http://stackoverflow.com/questions/25002520/testing-an-angularjs-factory-with-karma-jasmine –

回答

0
cntrlrCandidate = function() { 
      return $controller('cntrlrCandidate', { 
       '$scope': scope 
      }); 
     }; 

您已经定义的函数cntrlrCandidate但不是任何地方打电话。

你需要先给它打电话,然后你会得到你的控制器;

cntrlrCandidate定义之后添加此行;

var ctrlCandidate =cntrlrCandidate(); 

OR

如果这样定义,而不是上面的函数定义的更好。

cntrlrCandidate = $controller('cntrlrCandidate', {'$scope': scope}); 

编辑:

你下面的相关HostelManagementServiceHostelManagementIndexDBService你不provided.So,你需要模拟了它所需的控制器。

添加以下脚本。

var HostelManagementIndexDBService,HostelManagementService; //declare at top 

// add in beforeEach 
HostelManagementIndexDBService = {}; 
HostelManagementIndexDBService = {}; 
module(function($provide) { 
    $provide.value('HostelManagementService', HostelManagementService); 
    $provide.value('HostelManagementIndexDBService', HostelManagementIndexDBService); 
}); 

UPDATE:

describe("ManagemntApp ", function() { 
    var HostelManagementIndexDBService, HostelManagementService; 
    beforeEach(module('ManagemntApp')); 
    var scope; 
    var cntrlrCandidate, 
     $location; 

    beforeEach(function() { 

     HostelManagementService = {}; 
     HostelManagementIndexDBService = {}; 


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

     inject(function($controller, $rootScope) { 

      scope = $rootScope.$new(); 
      cntrlrCandidate = $controller('cntrlrCandidate', { '$scope': scope }); 
     }) 
    }); 


    it('return will pass the Amount', function() { 

     scope.Candidate = {}; 
     scope.Candidate.Amount = 2000; 
     scope.validateAmount(); 
     expect(scope.IsValidAmount).toEqual(true); 
    }); 


}); 
+0

能否请您检查UPDATE1 –

+0

我想这方式也var ctrlCandidate = cntrlrCandidate(); 但这不能解决我的问题。:-( –

+0

请参阅编辑更新的答案 –