2014-04-25 94 views
1

我想知道,在测试我的控制器时,如果在调用函数后设置了sessionStorage变量。下面是我的测试:在AngularJS的单元测试中获取sessionStorage项目

it('should be able to set language to the storage through SessionService', inject(['SessionService', function (SessionService) { 
     $scope.openChooseLanguage(); 
     $scope.modalInstance.close('fr'); 
     // What to write there ? 
}])); 

在我的控制器我有设置一个“郎”项目和返回值作为我SessionService的第二个参数的openChooseLanguage功能:

$scope.openChooseLanguage = function(){ 
    if($scope.lang == '' || $scope.lang == null){ 
     $scope.modalInstance = $modal.open({ 
      templateUrl: 'views/modals/chooseLanguage.html', 
      controller: 'ChooseLanguageCtrl' 
     }); 

     $scope.modalInstance.result.then(function (result) { 
      //Define user language in Session Storage 
      SessionService.set('lang', result); 
     }, function() { 
      $scope.canceled = true; 
      $scope.openChooseLanguage(); 
     }); 
    } 
}; 

这里是我的SessionService,简单地设置,获取,取消设置,我的项目:

return { 
     get : function(key){ 
      return sessionStorage.getItem(key); 
     }, 
     set : function(key, val){ 
      broadcast(key, val); 
      return sessionStorage.setItem(key, val); 
     }, 
     unset : function(key){ 
      return sessionStorage.removeItem(key); 
     } 
    }; 

那么,什么是知道如果“郎”项目已设置的解决方案?我刚开始用AngularJS和Jasmine单元测试,所以我是一个现在有点糊涂了......

UPDATE

我只是试图加入到我的测试:

beforeEach(function() { 
     $sessionStorage = jasmine.createSpyObj('SessionService', ['get', 'set', 'unset']); 
    }); 

it('should be able to set language to the storage through SessionService', inject(['SessionService', function (SessionService) { 
     $scope.openChooseLanguage(); 
     $scope.modalInstance.close('fr'); 
     expect($sessionStorage.set).toHaveBeenCalledWith('lang','fr'); 
    }])); 

但当运行我的测试时,我有以下错误:

预期间谍SessionService.set被调用['lang', 'fr' ],但它从未被称为

回答

2

执行以下操作:

  1. 声明变量将举行注入SessionService
  2. 注入的服务和其set方法
  3. 使用toHaveBeenCalledWith方法使用spyOn检查

因此,你应该有此:

var SessionService; 

beforeEach(inject(function(_SessionService_) { 
    SessionService = _SessionService_; 
    spyOn(SessionService,'set').andCallThrough(); 
})); 

it('should be able to set language to the storage through SessionService',function(){ 
    $scope.openChooseLanguage(); 
    $scope.modalInstance.close('fr'); 

    expect(SessionService.set).toHaveBeenCalledWith('lang','fr'); 
}); 
+0

按预期工作谢谢:) – lightalex