【问题标题】:karma test returning validateAmount is not a function返回 validateAmount 的业力测试不是函数
【发布时间】:2017-01-31 09:03:23
【问题描述】:

我正在尝试测试将检查到期金额的范围函数,但在运行测试时我得到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);
    });


});

我不知道是什么引起了注意。

这是我遇到的错误。

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


});

【问题讨论】:

标签: angularjs karma-runner karma-jasmine angular-mock


【解决方案1】:
cntrlrCandidate = function() {
            return $controller('cntrlrCandidate', {
                '$scope': scope
            });
        };

您已经定义了函数cntrlrCandidate,但没有在任何地方调用。

你需要先调用它,然后你会得到你的控制器;

cntrlrCandidate 定义之后添加这一行;

var ctrlCandidate  =cntrlrCandidate ();

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

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

编辑:

您的控制器需要遵循您未提供的依赖关系 HostelManagementServiceHostelManagementIndexDBService。所以,您需要模拟它。

添加以下脚本。

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


});

【讨论】:

  • 我也试过这种方式 var ctrlCandidate =cntrlrCandidate ();但这并不能解决我的问题。 :-(
  • 当然,我将它们用于其他功能,但现在我只是想测试该功能,然后为什么需要它,你能解释一下吗?
  • 每当您测试任何控制器、工厂、服务...等时,您都需要提供所需的依赖关系,否则当您运行应用程序时,Angular 会以同样的方式给出 DI 错误。现在您就进入了业力控制台
  • 感谢您的解释,但我仍然无法解决问题。 :-(
  • 是的,我在您的提示下进行了小型谷歌搜索,非常感谢。它是固定的
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多