2016-02-27 3 views
0

Я создал угловую настраиваемую директиву с сервисом под названием scriptingService. Цель состоит в том, чтобы высмеять вызов службы с помощью spyOn. Это часть теста:Как mockout servicecall в тесте жасмина?

beforeEach(inject(function ($rootScope, $compile,_scriptingService_) { 
     scope = $rootScope.$new(); 
     scope.row = 1; 

     scriptingService = _scriptingService_; 
     Restangular = _Restangular_; 

     spyOn(Restangular, 'all').and.callThrough(); 

     spyOn(scriptingService, 'getScript').and.callThrough(); 

     element = angular.element('<ul id="rows" ui-list="row">'); 
     $compile(element)(scope); 
     scope.$digest(); 
    })); 

Это код директивы:

.directive('uiList', [ 
    function(scriptingService) { 
     return { 
      scope: { 
       lengthModel: '=uiList' 
      }, 
      link: function(scope, elm, attrs) { 
       scope.$watch('lengthModel', function(newVal) { 
        scope.test=2; 
        console.log('kut'); 

        scriptingService.getScript(request).then(function(scripts){ 
         scope.scripts = scripts; 
        }); 

       }); 
      } 
     }; 
    } 
]); 

Однако я получаю сообщение об ошибке:

RestangularProvider <- Restangular <- scriptingService 

Как можно издеваться над scriptingService и убедитесь, метод был вызван? Plunker исх: http://plnkr.co/edit/CDc7EV?p=preview

+0

Ваш plunkr имеет несколько проблем: старый жасмин версии в сочетании с новым синтаксисом, and.callThrough() не работает в версии 1.3.1 (обновление жасмин или использование иCallThrough()), и ваш скриптингService не существует в plunkr. Ожидается ошибка «Неизвестный поставщик» на plunkr, так как такой службы не зарегистрировано в модуле. –

+0

Я обновил plunkr и добавил scriptService. Я издевался над Restangular, но все еще получаю сообщение об ошибке: Ошибка: Неизвестный поставщик: RestangularProvider <- Restangular <- scriptingService –

+0

Я не вижу его на http://plnkr.co/edit/uhyzg6?p=preview –

ответ

0

Есть несколько вопросов здесь:

  1. Как комментарий сказано выше, необходимо использовать более новую версию жасмин для callThrough функциональности, но и Restangular требует подчеркивания, так который также должен быть указан в вашем html-файле.

  2. Кроме того, инъекции зависимостей необходимо быть установлены для вашей директивы, так как он был не в состоянии внедрить scriptingService должным образом, что не позволило ему позвонить scriptingService.getScript, поскольку scriptingService был undefined. Вопрос заключается в том, что

    [ function(scriptingService) {}] 
    

    не будет работать, чтобы ввести scriptingService в uiList. Он просто заканчивается undefined.

    Он должен быть либо

    ['scriptingService', function(scriptingService) {}] 
    

    ИЛИ

    function(scriptingService) {} 
    

    Для справки: https://docs.angularjs.org/guide/di#dependency-annotation

  3. request никогда не определен, когда он привыкает в этом коде, я не уверен, что это должно быть.

    scriptingService.getScript(request).then(function(scripts) { 
    scope.scripts = scripts; 
    }); 
    
  4. После устранения этих проблем, тест по-прежнему не удается, говорят об ошибке: Неожиданный запрос: GET/сценариев.

    Я смог исправить это, введя в тесты $httpBackend (который является сервисом для насмешек http-вызовов в угловом выражении) и ожидает запроса. Поэтому я изменил

    inject(function ($rootScope, $compile,_scriptingService_,_Restangular_) 
    

    К

    inject(function ($rootScope, $compile,_scriptingService_,_Restangular_, $httpBackend) 
    

    и добавили

    $httpBackend.expectGET("/scripting").respond([]); 
    

    после того, как spyOn «s, то тест прошел. Я не уверен, что именно этот HTTP-вызов должен возвращать, но это всего лишь пример того, как вы могли его протестировать.

    Для справки: https://docs.angularjs.org/api/ngMock/service/ $ httpBackend

 Смежные вопросы

  • Нет связанных вопросов^_^