AngularJs单元测试-检查是否;Init";函数被调用

AngularJs单元测试-检查是否;Init";函数被调用,angularjs,unit-testing,jasmine,Angularjs,Unit Testing,Jasmine,我使用jasmine作为测试框架,我有下面的控制器要测试。我总是有一个Init()函数,在这里我对这个控制器进行初始化调用 现在我想测试初始化控制器时是否调用了Init函数 function UnitTestsCtrl() { var that = this; this.Init(); } UnitTestsCtrl.prototype.Init = function() { var that = this; //Some more Stuff } angular

我使用jasmine作为测试框架,我有下面的控制器要测试。我总是有一个Init()函数,在这里我对这个控制器进行初始化调用

现在我想测试初始化控制器时是否调用了Init函数

function UnitTestsCtrl() {
   var that = this;
   this.Init();
}

UnitTestsCtrl.prototype.Init = function() {
    var that = this;
    //Some more Stuff
}

angular.module("unitTestsCtrl", [])
       .controller("unitTestsCtrl", UnitTestsCtrl);
但我无法检查在创建控制器时是否调用了Init函数。我知道我的示例不起作用,因为spy是在创建后在Init函数上设置的

describe('Tests Controller: "UnitTestsCtrl"', function() {
var ctrl;

   beforeEach(function() {
         module('app.main');
         inject(function ($controller) {
            ctrl = $controller('unitTestsCtrl', {});
         });
   });

   it('Init was called on Controller initialize', function () {
       //thats not working
       spyOn(ctrl, 'Init');
       expect(ctrl.Init).toHaveBeenCalled();
   });
});
解决方案:

在beforeach函数中在原始原型上创建spy

 beforeEach(function() {
     module('app.main');

     spyOn(UnitTestsCtrl.prototype, 'Init');

     inject(function ($controller) {
        ctrl = $controller('unitTestsCtrl', {});
     });
 });

 it('Init was called on Controller initialize', function () {
        expect(ctrl.Init).toHaveBeenCalled();
 });

事实上,你不能也不需要这样做。无法执行此操作的原因是,您正在对控制器构造函数调用
init()
,即在实例化时,当您在测试中调用
$controller
服务实例化控制器时,会发生这种情况。所以你设置间谍太晚了。您可能不需要这样做,因为如果控制器是实例化的,那么肯定会调用init方法。但是,如果您在init中进行任何特定的服务/依赖调用,您可以监视这些模拟并设置期望值

您的期望值是:
已执行服务调用
,因此为该服务创建一个间谍并设置期望值

例如:

   var myService = jasmine.createSpyObj('myService', ['someCall']);
   myService.someCall.and.returnValue($q.when(someObj));
   //...


  ctrl = $controller('unitTestsCtrl', {'myService':myService});
并对myService的方法someCall设置期望值

 expect(myService.someCall).toHaveBeenCalled();

如果您真的想监视
init
,那么您需要访问规范中的
UnitTestsCtrl
构造函数,并且需要在实例化之前设置其原型方法
init

我想如果忘记调用init()控制器初始化时的方法-我可以直接测试调用,我知道这没有问题。@squadwuschel您的期望是执行
服务调用
对吗?那就监视一下吧。你实际上陷入了一种鸡蛋般的境地,因为实例化时控制器在控制器实例上调用init.sry-我编辑了我的原始帖子,并将预期更改为正确的(复制粘贴错误)@squadwuschel如果你真的想监视init,然后你需要访问规范中的
UnitTestsCtrl
构造函数,你需要在它的原型上设置spy你帮了我-我正在调用Init函数中的一个服务,我现在正在检查这个服务,它工作正常-thx