Angularjs Jasmine mock метод вызывается при создании экземпляра контроллера - PullRequest
0 голосов
/ 05 июня 2018

У меня есть простой компонент, подобный этому:

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

        serviceCall();
    }
});

Что я хочу сделать, так это шпионить за методом serviceCall, чтобы вернуть некоторый предопределенный json.Проблема в том, что для получения контроллера мне нужно сделать что-то вроде

var myComponent = angular.element('<my-component><my-component>');
myComponent.element.controller('myComponent');

Но я не могу назвать это, пока компонент не создан, и я не могу создать компонент, потому что я не сделалпока что насмехайтесь над вызовом метода.

Как мне обойти этот catch-22?

1 Ответ

0 голосов
/ 05 июня 2018

К сожалению, практически нет пути к этому.

Однако, если ваша функция 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

});

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...