2015-06-09 3 views
0

я следующие услуги и директиву:Тест вызова службы внутри директивы

angular.module("epcApp", []) 
.service("epcData", function($http, $q){ 
    var urls = { 
     load: "some-url", 
     save: "some-url" 
    }; 
    this.load = function(){ 
     return $http.get(urls.load).then(function(data){ 
      return data; 
     }); 
    } 
    this.save = function(req){ 
     return $http.get(urls.save, req).then(function(data){ 
      return data; 
     }); 
    } 
}) 
.directive("epc", ['epcData', function(epcData){ 
    return { 
     restrict: "E", 
     templateUrl: "some-url", 
     link: function(scope, element, args, form){ 
      scope.collectSelects = function(container){ 
       // some code 
      } 

      scope.collectCheckBoxes = function(container){ 
       // some code 
      } 

      epcData.load().then(function(data){ 
       scope.userOptions = 
       // do something with scope.collectCheckBoxes and scope.collectSelects 
      }); 
     } 
    } 
}]); 

И я хочу, чтобы тест:

  1. epcData.load была вызвана внутри директивы
  2. collectSelects и collectCheckboxes были вызваны внутри обещания от epcData.load

Не могу понять, как издеваться над сервисом. Это то, что я от того, что я видел в документации:

//Load the EPC main module 
    beforeEach(module('epcApp')); 

    //Intialize the directive with a mock scope 
    beforeEach(function(){ 
     var element, scope, epcData, $httpBackend, mock; 
     mock = { 
      load: jasmine.createSpy(), 
      save: jasmine.createSpy() 
     } 
     module(function($provide){ 
      $provide.service('epcData', mock); 
     }) 
     inject(function($rootScope, $compile, $injector){ 
      epcData = $injector.get('epcData'); 
      scope = $rootScope.$new(); 
      element = angular.element("<epc></epc>"); 
      element = $compile(element)(scope); 
      scope.$digest(); 
     }) 
    }); 

    it("should have loaded data", function(){ 
     expect(mock.load).toHaveBeenCalled(); 
    }) 

Я получаю следующее сообщение об ошибке Error: [ng:areq] Argument 'fn' is not a function, got Object

Если удалить разделы $provide и $injector вообще, я получаю «Неожиданное request ' ошибка, когда фактический метод epcData.load пытается выполнить http-запрос. Поэтому мне кажется, что я приближаюсь к переопределению метода службы, но я делаю это неправильно.

ответ

0

Ошибка возникает, потому что вам нужно передать функцию-конструктор, чтобы создать услугу «Угловая». Вы передаете объект.

Вы можете использовать функцию value вместо service

$provide.value('epcData', mock);

Или вы можете создать фиктивную функцию конструктора.

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

+0

Я действительно пробовал делать «значение», но я получаю другую ошибку, в основном мой исходный метод загрузки загружается, пытается загрузить исходный URL-адрес и получить «Неожиданный запрос». Поэтому в этом случае кажется, что я не могу переопределить свои оригинальные методы. Я рассмотрю документы для шпионов, как вы рекомендуете. Благодарю. – Fernando

+0

Если вы используете значение, метод загрузки источника не должен срабатывать, поскольку он был затенен этой службой значений. – Chandermani

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