0

У меня есть вызов функции сервиса в контроллере. Ниже приведен кодтестирование .success и .error службы в контроллере jasmine

Сервис

(function() { 
'use strict'; 
angular.module('MyApp') 
    .service('MyService', ['$http', function ($http) {             
     return { 
      getMyData: function (extension) {           
       return $http.get('www.something.com'); 
      }     
     }; 
    }]) 
})(); 

Контроллер

var getMyData = function() { 
      MyService.getMyData(extension).success(function (results) { 
       //Some functionality here 
      }) 
       .error(function (err, status) { 
       //Some functionality here 
      }); 
     } 
$scope.Call=function(){ 
    getMyData(); 
} 
$scope.Call(); 

Теперь, пожалуйста, скажите мне, как издеваются вызов службы (может быть с поставщиками). Как протестировать вышеуказанные функции с полным охватом кода.

Мой файл спецификации:

$provide.service("MyService", function() { 
      this.getMyData= function() { 
       var result = { 
        success: function (callback) { 
         return callback({ ServerFileName: "myserverfilename"}); 
        }, 
        error: function (callback) { 
         return callback({ ServerFileName: "myserverfilename" }); 
        } 
       }; 
       return result; 
}   

//...... 
my controller initiation and other code 

Этот код не покрывает блок ошибок и дает ошибку

Cannot read property 'error' of undefined 

Пожалуйста, помогите мне, как писать/глумиться функцию getMyData моей службы в мой файл спецификации

Заранее спасибо.

ответ

0

Вам нужно использовать spyon, который создаст какой-то макет для вашего сервиса. Вам нужно сделать это в тестовом файле. Пожалуйста, проверьте код ниже:

spyOn(MyService, "getMyData").and.callFake(() => { 
      return { 
       error: (callback) => { 
        return callback({}); 
       } 
      }; 
     }); 

Надежда я ответил на ваш вопрос

+0

где я должен писать этот код внутри поставщика или spec (it)? – aditya

+0

Вы должны написать это раньше. Что-то вроде этого:. beforeEach (angular.mock.inject ((MyService) => { вар _myService = MyService; spyOn (_myService, "getMyData") and.callFake (() => { возвращение { ошибка: (обратный вызов) => { обратный обратный вызов ({});} }; });} –

+0

Когда я делаю это в beforeEach он показывает ошибку «MyService.getMyData (...). успех не является функцией « – aditya

1

С .success и .error старыми и были заменены .then(successCallback, errorCallback), вы должны рассмотреть вопрос о замене вашего прикованных .success и .error вызовов с помощью одного вызова метод .then с двумя обратными вызовами в качестве аргументов для него: первый - обратный вызов успеха, а второй - обратный вызов ошибки.

Если это то, что вы готовы сделать, вот ваш рабочий пример:

Вы модуль, обслуживание и контроллер

angular.module('MyApp', []); 

angular.module('MyApp') 
.service('MyService', ['$http', function ($http) {             
    return { 
     getMyData: function (extension) {           
      return $http.get('www.something.com'); 
     }     
    }; 
}]); 

angular.module('MyApp') 
.controller('MyAppController', ['$scope', function($scope){ 
    var extension = { foo: 'bar' }; 
    var getMyData = function() { 
     MyService.getMyData(extension).then(function (results) { 
      //Some functionality here 
     }, function (err, status) { 
      //Some functionality here 
     }); 
    } 
    $scope.Call=function(){ 
     getMyData(); 
    } 
    $scope.Call(); 
}]); 

И ваш Тест

describe('Controller: MyAppController', function(){ 
    beforeEach(module('MyApp')); 
    var flag, extension; 
    extension = { foo: "bar" }; 
    beforeEach(inject(function($controller, $rootScope, _MyService_) { 
     $scope = $rootScope.$new(); 
     MyService = _MyService_; 
     spyOn(MyService, 'getMyData').and.callFake(function(){ 
      return{ 
       then: function(successCallback, errorCallback){ 
        if(flag) successCallback(); 
        else errorCallback(); 
       } 
      } 
     }); 
     MyAppController = $controller('MyAppController', { 
      $scope: $scope, 
      MyService: MyService 
     }); 
    })); 

    describe('function: Call', function() { 
     //Text for Success Callback 
     it('should implicitly call MyService.getMyData with an extension object', function() { 
      flag = true; 
      $scope.Call(); 
      expect(MyService.getMyData).toHaveBeenCalledWith(extension); 
     }); 
     //Text for Error Callback 
     it('should implicitly call MyService.getMyData with an extension object', function() { 
      flag = false; 
      $scope.Call(); 
      expect(MyService.getMyData).toHaveBeenCalledWith(extension); 
     }); 
    }); 
}); 

ОБНОВЛЕНИЕ: Я пробовал делать что-то подобное, чтобы работать, но не повезло. Поскольку звонок .error() связан с вызовом .success(), и это то, что будет вызвано только после того, как был вызван .success(), он никогда не дойдет до звонка .error(), и мы не сможем высмеять .error(). Так что, если мы пытаемся это делать, мы всегда получим ошибку, как:

Cannot read property 'error' of undefined

Так как вы можете использовать свой комментарий /*istanbul ignore next*/, чтобы пропустить эту часть в освещении, или переключиться на .then().

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

+0

Спасибо за ваше решение. Вы имеете в виду, что нет возможности проверить успех и блоки ошибок, не меняя их тогда? Я знаю, как писать, используя тогда. Но теперь у нас нет доступа к изменению нашего исходного кода. Любым другим путем? – aditya