2015-12-09 4 views
1

У меня есть директива о том, что я хочу выполнить единичный тест. Это работает, но мне нужно использовать службу в контроллере. Как мне это сделать?Как высмеять сервис для контроллера директивы angularjs

app.directive('myDirective', function() { 
return { 
    restrict: 'EA', 
    scope: true, 
    templateUrl: 'my-directive.html', 
    controllerAs: 'md', 
    link:function (scope){ 

    }, 
    controller: function($scope, $element, $stateParams,service1) { 
      this.test = service1.testData; 
    } 
    } 
}); 

И мой блок тестовый файл до сих пор

describe("Directive : my directive", function() { 
var element, scope, controller, service1,stateParams; 

beforeEach(module("app")); 
beforeEach(module('src/templates/my-directive.html')); 
beforeEach(function() { 
    service1 = { 
     method : { 
      name : "Test" 
     } 
    }; 
}); 

beforeEach(inject(function($compile, $rootScope) { 
    scope = $rootScope.$new(); 
    element = "<my-directive></my-directive>"; 
    element = $compile(element)(scope); 
    scope.$digest(); 

    controller = element.controller("myDirective"); 

    })); 

    it("should do something to the scope", function() { 
    // test functions using service1 
    }) 

}); 

и моя служба

app.factory('service1', function(){ 
     service1.testData = false; 

     service1.myPromise = function (t) { 
           var deferred = $q.defer(); 
           $http.get("....") 
           .success(function(result) { 
           deferred.resolve(result) 
          }) 
          .error(function(error) { 
           deferred.reject(error) 
          }); 
          return deferred.promise; 
         } 
}); 

Как добавить мою высмеивал услугу мой контроллер?

ответ

0

Перед составлением директивы вы можете использовать услугу $provide в блоке beforeEach.

var service1; 
beforeEach(module(function($provide) { 
    service1 = { 
    testData: 'Test data', 
    myPromise: function() {} 
    }; 
    $provide.value('service1', service1); 
})); 

Если метод возвращает сервис обещание, вы можете следить за методом и возвращать обещание, когда вызывается метод.

var deferred; 
beforeEach(inject(function($q) { 
    deferred = $q.defer(); 
    spyOn(service1, 'myPromise').and.returnValue(deferred.promise); 
})); 

Так что позже в ваших спецификациях вы можете отклонить или разрешить обещание.

deferred.resolve(); 
deferred.reject(); 
+0

работает для меня :) спасибо @Puigcerber – bkoya

+0

Прохладный! Теперь вы можете принять ответ @bkoya;) – Puigcerber

+0

Что произойдет, если я хочу заменить значение testData в части «it», чтобы протестировать ошибку. например, он ('should fail', function() {service1.testData = 'значение сбой "}); – bkoya

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