2016-05-30 3 views
1

Я хочу, чтобы модуль тестировал мой контроллер. Я начал с базовых утверждений теста API ожидающих. Но я сталкиваюсь с проблемой в насмешливых методах измерения внутри условной проверки. Я получаю ошибку undefined, так как она недоступна в области видимости, доступен только глобальный метод logout().Ошибка Karma - Ожидаемое неопределенное значение

Я попытался издеваться над localStorageService, используя spyOn как истинный, чтобы удовлетворить это условие, но это все еще не помогает. Любое решение будет очень полезно, чтобы заставить меня начать игру.

Контроллер:

angular.module('app').controller('sampleCtrl', 

     function($scope, $state, $http, $rootScope, localStorageService) { 

      if (!(localStorageService.get('isAuthenticated'))) { 

       $state.go('home'); 

      } 
      if (localStorageService.get('isAuthenticated') === true) { 

       //http post calls made here to perform certain operation on page load 

       $scope.someMethod = function(){ 

        //do something 

        } 

      } 

      $scope.logOut = function() { 

       localStorageService.set('property', ''); 

       localStorageService.set('isAuthenticated', false); 

       $state.go('home'); 

      }; 
}); 

Карма:

'use strict'; 

describe('Controller: sampleCtrl', function() { 

    /** to load the controller's module */ 
    beforeEach(module('app')); 

    var sampleCtrl,scope,httpBackend,deferred,rootScope; 

    beforeEach(inject(function ($controller,_$rootScope_,$httpBackend,$q) { 

     var store = {}; 
     scope= _$rootScope_.$new(); // creates a new child scope of $rootScope for each test case 
     rootScope   = _$rootScope_; 
     localStorageService = _localStorageService_; 
     httpBackend   = $httpBackend; 

     httpBackend.whenGET(/\.html$/).respond(''); 

     spyOn(localStorageService, 'set').and.callFake(function (key,val) { 
      store[key]=val; 
     }); 

     spyOn(localStorageService, 'get').and.callFake(function(key) { 
      return store[key]; 
     }); 

     sampleCtrl = $controller('sampleCtrl',{ 
      _$rootScope_:rootScope, 
      $scope:scope, 
      $httpBackend:httpBackend, 
      _localStorageService_:localStorageService 
      // add mocks here 
     }); 

     localStorageService.set('isAuthenticated',true); 

    })); 

    /**ensures $httpBackend doesn’t have any outstanding expectations or requests after each test*/ 
    afterEach(function() { 
     httpBackend.verifyNoOutstandingExpectation(); 
     httpBackend.verifyNoOutstandingRequest();  
    }); 


    it('sampleCtrl to be defined:',function(){ 

     httpBackend.flush(); 
     expect(sampleCtrl).toBeDefined(); 

    }); 

    // failing test case - scope.someMethod not available in scope 
    it('is to ensure only authenticated user can access the state methods',function(){ 
      localStorageService.get('isAuthenticated'); 
      httpBackend.flush(); 
      expect(scope.someMethod).toBeDefined(); 
    }); 


}); 
+0

Почему бы вам просто не определить _someMethod_ за пределами _if_ и просто передать параметры, необходимые для его работы? –

+0

@ min che: исправьте меня, если я ошибаюсь .. мое намерение заключается в том, чтобы выполнить этот метод только для аутентифицированных пользователей. Если я выведу его из условия для тестирования ... не игнорировать его? Также ... им пытаются понять, почему он не работает и как заставить его работать .. вместо того, чтобы искать обходное решение для него .. – RVR

ответ

1

Я сумел заставить его работать. Проблема заключалась в том, что у localStorageService не было isAuthenticated установлено значение true при запуске контроллера. Установите его на true перед вызовом контроллера.

+1

спасибо большое .. я даже не подумал об этих строках .. :-) – RVR

+0

it разрешила эту проблему .. но она открывает новую. Поскольку я помещаю ее в блок ** beforeEach() ** перед запуском контроллера, он запускает все вызовы службы http в контроллере даже для тестовых случаев, в которых Я просто хочу утверждать, определен ли метод scope или нет. – RVR

+0

Я изменил контроллер, чтобы показать, где сделаны http-звонки .. из-за этого ... все единичные тестовые примеры, когда я пытаюсь утверждать определенную функциональность, оказываются затронутыми, заставляя меня разрешать/издеваться над http-вызовами в каждом тестовом случае – RVR