2016-05-30 18 views
1

Ich möchte meinen Controller testen. Ich begann mit grundlegenden Testaussagen der expect API. Aber ich stehe vor der Herausforderung, innerhalb einer konditionellen Prüfung die Umfangsmethoden zu verspotten. Ich erhalte einen undefined Fehler, da er nicht unter dem Bereich verfügbar ist, nur die globale -Methode ist verfügbar.Karma-Fehler - Erwartet undefiniert, um definiert zu werden

Ich versuchte, die localStorageService mit spyOn als wahr zu verspotten, um die Bedingung zu erfüllen, aber das ist immer noch keine Hilfe. Jede Lösung wird eine große Hilfe sein, um mich zum Kickstarter zu machen.

Controller:

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

      }; 
}); 

Karma:

'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

Warum definieren Sie _someMethod_ nicht außerhalb von _if_ und übergeben Sie einfach die Parameter, die dafür benötigt werden? –

+0

@min che: korrigieren Sie mich, wenn ich falsch liege .. meine Absicht ist, diese Methode nur für die authentifizierten Benutzer ausführen .. wenn ich es aus dem Zustand für Testzwecke verschieben..ist es nicht trotzt es? Auch ... ich versuche zu verstehen, warum es nicht funktioniert und wie man es funktioniert ... anstatt für einen Workaround dafür zu gehen .. – RVR

Antwort

1

Ich habe es geschafft, es Arbeit zu bekommen. Das Problem war, dass localStorageService nicht isAuthenticated auf True beim Starten des Controllers festgelegt wurde. Setzen Sie den Wert auf true, bevor Sie den Controller aufrufen.

+1

danke viel..ich dachte nicht einmal an diese Zeilen .. :-) – RVR

+0

es löste dieses Problem..aber es öffnet sich neues .., da ich es in ** beforeEach() ** blockiere, bevor ich den Controller starte .. es löst alle http-Serviceaufrufe in der Steuerung selbst für die Testfälle aus, in denen Ich möchte nur feststellen, ob eine Scope-Methode definiert ist oder nicht. – RVR

+0

Ich habe den Controller geändert, um zu zeigen, wo http-Aufrufe gemacht werden. Aufgrund dessen ... werden alle Unit-Testfälle, in denen ich versuche, eine bestimmte Funktionalität zu behaupten, betroffen, die mich zwingt, http-Aufrufe in jedem Testfall aufzulösen – RVR