AngularJS Jasmine тестирует функции инициализации

Я пытаюсь проверить вызовы функций из функции инициализации моего контроллера. Я маршрутизирую различную логику на основе stateParams и хочу написать модульные тесты для этих сценариев, но у меня возникают проблемы с ее работой.

Моя функция инициализации

    var _init = function () {
        // Get full companyList
        servicecall().then(function (response) {

            if ($stateParams.ID) {
                $scope.callOne();
            }
            else if ($stateParams.Index == -1) {
                $scope.callTwo();
            }
            else if ($stateParams.Index == '' || $stateParams.Index == null) {
                $scope.callThree();
            }
            else
                $scope.callFour();
        },
        function (err) {
            console.log(err);
        });
    };
    _init();

Итак, я просто хочу установить $stateParams.Index = -1 и убедиться, что вызывается callTwo().

Мой beforeEach выглядит

    beforeEach(function () {

        controller = $controller('Controller', {
            $scope: $scope,
            $stateParams: $stateParams,
            $state: $state
        });

        // And add $scope's spyOns
        spyOn($scope, 'callOne').and.callThrough();
        spyOn($scope, 'callTwo').and.callThrough();
        spyOn($scope, 'callThree').and.callThrough();
        spyOn($scope, 'callFour').and.callThrough();
    });

Сначала я попробовал следующее, что, конечно, не сработало; там написано, что шпиона не вызывали.

        it("should call callTwo if stateParams.index is -1", function () {
            $stateParams.Index = -1;
            expect($scope.callTwo()).toHaveBeenCalled();
        });

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

Этот говорит, что за callTwo уже шпионили.

    it("should call callTwo if stateParams is -1", function () {
            $stateParams.Index = -1;
            spyOn($scope, 'callTwo').and.callThrough();

            controller = $controller('Controller', {
                $scope: $scope,
                $stateParams: $stateParams,
                $state: $state
            });

            expect($scope.callTwo).toHaveBeenCalled();
        });

Но если я перемещаю объявление шпиона после инициализации контроллера, он говорит, что он больше не вызывается

  1. Как я могу гарантировать, что вызовы выполняются должным образом во время создания экземпляра контроллера?

person Joshua Ohana    schedule 03.07.2015    source источник


Ответы (1)


Не уверен, что это лучшее решение, но в настоящее время больше ничего не приходит на ум, и это определенно работает.

У вас может быть describe для каждого такого теста, так как $stateParams вводятся при создании контроллера. Вот почему делать это внутри it недостаточно, так как $scope в это время принадлежит уже созданному контроллеру.

Итак, вам нужно иметь:

describe('Controller tests for when Index === -1', function () {

    beforeEach(function (...) {

        $stateParams.Index = -1; 

        controller = $controller('Controller', {
             $scope: $scope,
             $stateParams: $stateParams,
             $state: $state
        });
    }

    // it tests for Index === -1 case
});

Таким образом, в этом примере все тесты it, которые у вас будут, гарантированно будут иметь $stateParams === 1. То же самое касается и других ваших значений.

person Omri Aharon    schedule 03.07.2015