проверка кармы, возвращающая validateAmount, не является функцией

Я пытаюсь протестировать функцию области, которая будет проверять причитающуюся сумму, но при выполнении теста я получаю validateAmount is not a function.

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);
    });


});

Я не мог понять, что делает уведомление.

Это ошибка, которую я получаю. imgur.com/0Q7ZV.png" alt="TestError">

Обновление 1:

Когда я написал так, сообщение об ошибке ниже.

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

Пожалуйста, проверьте эту ошибку: введите здесь описание изображения

Обновление 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);
    });


});

person kernal lora    schedule 22.09.2016    source источник
comment
stackoverflow.com/questions/25002520 /   -  person kernal lora    schedule 13.10.2016


Ответы (1)


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

Вы определили функцию cntrlrCandidate, но нигде не вызывали.

Вам нужно сначала вызвать его, тогда вы получите свой контроллер;

Добавьте эту строку после определения cntrlrCandidate;

var ctrlCandidate  =cntrlrCandidate ();

OR

лучше, если вы определите это вместо определения вышеуказанной функции.

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

ИЗМЕНИТЬ:

Ваш контроллер требует следующих зависимостей HostelManagementService и HostelManagementIndexDBService, которые вы не предоставили. Поэтому вам нужно смоделировать его.

Добавьте следующий скрипт.

var HostelManagementIndexDBService,HostelManagementService; //declare at top

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

ОБНОВИТЬ :

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);
    });


});
person RIYAJ KHAN    schedule 22.09.2016
comment
Я пробовал и таким образом var ctrlCandidate =cntrlrCandidate(); Но это не могло решить мою проблему. :-( - person kernal lora; 22.09.2016
comment
Конечно, я использую их для других функций, но сейчас я только пытаюсь проверить эту функцию, тогда зачем она нужна, не могли бы вы объяснить? - person kernal lora; 22.09.2016
comment
всякий раз, когда вы тестируете какой-либо контроллер, фабрику, службы... и т. д., вам необходимо предоставить необходимую зависимость, в противном случае angular будет выдавать ошибку DI таким же образом, когда вы запускаете приложение. и теперь вы получаете в консоли кармы - person RIYAJ KHAN; 22.09.2016
comment
Спасибо за объяснение, но я все еще не мог решить проблему. :-( - person kernal lora; 22.09.2016
comment
Да, я сделал небольшой поиск в Google с вашей подсказкой, большое спасибо. это было исправлено - person kernal lora; 22.09.2016