Angularjs Jasmine模拟方法调用控制器实例化

时间:2018-06-05 12:14:23

标签: angularjs karma-jasmine

我有一个像这样的简单组件:

.component('myComponent', {
    templateUrl: 'example.html',
    controller: function() {
        function serviceCall() {}

        serviceCall();
    }
});

我想要做的是监视serviceCall方法以返回一些预定义的json。问题是要获得控制器,我需要做一些像

这样的事情
var myComponent = angular.element('<my-component><my-component>');
myComponent.element.controller('myComponent');

但是在创建组件之前我无法调用它,并且我无法创建组件,因为我还没有模拟方法调用。

如何绕过这个捕获22?

1 个答案:

答案 0 :(得分:1)

不幸的是,几乎没有办法解决它。

但是,假设您的serviceCall()函数在内部调用服务中的函数,您可以窥探它。 (记住Angular良好实践 - 关注点分离原则)

假设你的代码:

.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

});

希望这会有所帮助:)