如何为angularjs指令的控制器模拟服务

时间:2015-12-09 13:20:45

标签: angularjs unit-testing

我有一个指令,我想进行单元测试。这有效,但我需要在控制器中使用该服务。我该怎么做?

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;
                        } 
});

如何将我的模拟服务添加到控制器?

1 个答案:

答案 0 :(得分: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();