Angularjs Jasmine模拟方法在控制器实例化时调用
我有一个简单的组件,如下所示:Angularjs Jasmine模拟方法在控制器实例化时调用,angularjs,karma-jasmine,Angularjs,Karma Jasmine,我有一个简单的组件,如下所示: .component('myComponent', { templateUrl: 'example.html', controller: function() { function serviceCall() {} serviceCall(); } }); 我想做的是监视serviceCall方法以返回一些预定义的json。问题是为了得到控制器,我需要做如下的事情 var myComponent = an
.component('myComponent', {
templateUrl: 'example.html',
controller: function() {
function serviceCall() {}
serviceCall();
}
});
我想做的是监视serviceCall方法以返回一些预定义的json。问题是为了得到控制器,我需要做如下的事情
var myComponent = angular.element('<my-component><my-component>');
myComponent.element.controller('myComponent');
var myComponent=angular.element(“”);
myComponent.element.controller('myComponent');
但是在创建组件之前我不能调用它,我也不能创建组件,因为我还没有模拟方法调用
我怎样才能摆脱这第二十二条军规呢?不幸的是,几乎没有办法摆脱它 但是,假设您的
serviceCall()
函数在内部调用服务中的函数,您可以发现这一点。(请记住良好实践-关注点分离原则)
假设您的代码:
.component('myComponent', {
templateUrl: 'example.html',
controller: function(SomeService) {
function serviceCall() {
SomeService.someFunction();
}
serviceCall();
}
});
您可以在测试中注入服务,并监视预期调用的函数:
var SomeService;
beforeEach(inject(function (_SomeService_) {
SomeService = _SomeService_;
}));
it('should call someFunction', function () {
spyOn(SomeService, 'someFunction').and.returnValue({
then: function () { // Mimic a promise
return ... mocked object ... ;
}
});
// Instantiate the controller
expect(SomeService.someFunction).toHaveBeenCalled();
// Expect stuff to have happened in the controller with the returned value
});
希望这有帮助:)太棒了。让我试试看是的,看起来很棒!