AngularJs单元测试-检查是否;Init";函数被调用
我使用jasmine作为测试框架,我有下面的控制器要测试。我总是有一个Init()函数,在这里我对这个控制器进行初始化调用 现在我想测试初始化控制器时是否调用了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
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