2015-12-09 55 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

在編譯指令之前,您可以在beforeEach塊中使用$provide服務。

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

如果你的服務方法返回一個promise,你可以監聽該方法並在調用該方法時返回一個promise。

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

如果我想在'it'部分替換testData的值來測試失敗會發生什麼。例如它('應該失敗',function(){service1.testData ='value to fail'}); – bkoya

相關問題