Как выполнить юнит-тестирование JS Asynch с Jasmine Mocking - PullRequest
0 голосов
/ 03 марта 2019

Я довольно новичок в JS, и у меня возникли некоторые проблемы с тестированием асинхронных методов с помощью жасмина.

Вот класс, который я хочу протестировать:

 test.factory('service', ['$http', '$q', function($http, $q) {
     var _func = function(varB, successCallback, errorCallback) {

         //Sanity check on input
         if (isNaN(varB)) {
             errorCallback('varB has to be a number');
             return;
         }

         if (parseInt(varB) < 0) {
             errorCallback('varB count has to be positive');
             return;
         }

         $http.get('http://www.test.com').then(function(response) {
             var data = angular.copy(response.data);
             if (successCallback) {
                 successCallback(data);
             }
         }, function(errorResponse) {
             if (errorCallback) {
                 errorCallback(errorResponse.data);
             }
         });
     };

     return {
         func: function(varB) {
             return $q(function(resolve, reject) {
                 _func(varB, resolve, reject);
             });
         }
     };
 }]);

Один изtests:

 beforeEach(inject(function($injector) {
     service = $injector.get(
         'service');
     $httpBackend = $injector.get('$httpBackend');
 }));

 it('should use the rejection handler if varB is in invalid format',
     function() {
         var successHandler = jasmine.createSpy('success');
         var failHandler = jasmine.createSpy('fail');
         service.func('abc').then(successHandler, failHandler);
         expect(successHandler).not.toHaveBeenCalled();
         expect(failHandler).toHaveBeenCalledWith('varB has to be a number');
     }
 );

Строка в тесте: expect(failHandler).toHaveBeenCalledWith('varB has to be a number'); по какой-либо причине никогда не выполняется.Я даже попытался поместить операторы отладки в класс обслуживания, чтобы увидеть, были ли достигнуты методы и достигли ли они.Но макет не смог обнаружить, что обратный вызов был вызван с заданным аргументом.

Было бы здорово получить некоторые идеи!Спасибо!

1 Ответ

0 голосов
/ 03 марта 2019

Хорошо, я нашел решение.

Получил подсказки здесь .

Так что дело в том, чтобы добавить инъекцию rootScope.Это сработало после этого!:)

beforeEach(inject(function($injector) {
     service = $injector.get(
         'service');
     $httpBackend = $injector.get('$httpBackend');
     $rootScope = $injector.get('$rootScope');
 }));

 it('should use the rejection handler if varB is in invalid format',
     function() {
         var successHandler = jasmine.createSpy('success');
         var failHandler = jasmine.createSpy('fail');
         service.func('abc').then(successHandler, failHandler);
         $rootScope.$digest();
         expect(successHandler).not.toHaveBeenCalled();
         expect(failHandler).toHaveBeenCalledWith('varB has to be a number');
     }
 );
...