Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Jasmine模拟方法在控制器实例化时调用_Angularjs_Karma Jasmine - Fatal编程技术网

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

});

希望这有帮助:)

太棒了。让我试试看是的,看起来很棒!