【问题标题】:AngularJs unit test - Check if "Init" function was calledAngularJs 单元测试 - 检查是否调用了“Init”函数
【发布时间】:2015-02-08 16:03:33
【问题描述】:

我正在使用 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 函数。我知道我的示例不起作用,因为间谍是在创建后在 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();
   });
});

解决方案:

在 beforeEach 函数中创建原始原型的间谍

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

【问题讨论】:

    标签: angularjs unit-testing jasmine


    【解决方案1】:

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

    您的期望是:Service Call executed 所以为该服务创建一个间谍并设置期望。

    示例:

       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 你的期望是Service Call executed 对吗?所以监视那个。您实际上处于鸡 蛋的情况,因为对 init 的调用是由控制器在实例化时在控制器实例上进行的。
    • sry - 我已经编辑了我的原始帖子并将期望更改为正确的(复制和粘贴错误)
    • @squadwuschel 如果你真的想监视 init,那么你需要在规范中访问 UnitTestsCtrl 构造函数,并且你需要在它的原型上设置 spy
    • 你帮助了我 - 我在我的 Init 函数中调用了一个服务,我现在正在检查这个服务,它工作正常 - thx
    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2021-12-30
    相关资源
    最近更新 更多