Дразнящий $ q.all в жасмине для контроллера angularjs - PullRequest
0 голосов
/ 14 февраля 2019

Я пишу тестовые примеры жасмина для углового контроллера, который имеет функцию init, имеющую массив обещаний, которые необходимо разрешить:

    (function () {
    angular.controller("xyz", ['$scope', "Utility", "Api",
        function ($scope, Utility, Api) {
            var locals = $scope.locals = {
                id: 1,
                amount: 2,
                products: 3
            };
            function init() {
                locals.busyPromise = Utility.resolveAll(
                    {
                        name: 'a',
                        promise: Api.get,
                        then: function (response) { locals.id = 2; }
                    },
                    {
                        name: 'b',
                        promise: Api.find,
                        then: function (response) { locals.amount = 4; }
                    }
                ).then(function (response) { locals.products = 6; });
            }
           init();
        }
    ])
})();

Утилита - это внешний сценарий, который разрешает каждое обещание в массиве и выполняетзатем их функция для установки локальных свойств.После того, как все обещания в массиве разрешены, он переходит к функции executeAll и выполняет ее.

Мой вопрос заключается в том, как мы можем посмеяться над Utility.resolveAll, вводя зависимости в Jasmine.В моем случае, что бы я ни пытался, оно никогда не входит в блок индивидуальных обещаний и идет непосредственно к блоку resolAll.

1 Ответ

0 голосов
/ 14 февраля 2019

Вот что я хотел бы сделать:

Сначала если все, макет Utility и Api сервисов

  let Utility, Api;
  beforeEach(() => {
    Utility = jasmine.createSpyObj('Utility', ['resolveAll']);
    Api = jasmine.createSpyObj('Api', ['find', 'get']);
  });

Затем в тестах:

it('should test component startup', function() {
       let resolveObjects;

       Utility.resolveAll.and.callFake(function(...args) {
         resolveObjects = args; // save all arguments, passed to `resolveAll` method

         return $q.when();
       })

       $scope = $rootScope.$new();
       let controller = $controller('xyz', {$scope, Utility, Api});
       $rootScope.digest(); // resolve $q.when so you can test overall promise

       expect($scope.locals.products).toBe(6); // test overall promise

       // now, test all the arguments

       // 0
       expect(resolveObjects[0].name).toBe('a');

       resolveObjects[0].promise();
       expect(Api.get).toHaveBeenCalledTimes(1);

       resolveObjects[0].then();
       expect($scope.locals.id).toBe(4); 

       // 1
       expect(resolveObjects[1.name).toBe('b');

       resolveObjects[1].promise();
       expect(Api.find).toHaveBeenCalledTimes(1);

       resolveObjects[1].then();
       expect($scope.locals.products).toBe(4); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...