2016-03-22 11 views
1

Ich versuche, einen Komponententest auf meinem Code zu starten. Ich folge viel Anleitungen im Internet, aber ich kann nicht erreichen, um meine UT zu bauen.

Ich möchte diesen Code testen:

"use strict"; 
var app = angular.module('address', []); 

app.controller("AddressBookController", ["$rootScope", "$scope", "viewState", 
    function($rootScope, $scope, viewState) 
{ 
    // PAGE DATA 
    $scope.pageLimit = 7; 
    $scope.pages = (viewState.state.pages) ? viewState.state.pages : []; 
    $scope.currentPage = (viewState.state.currentPage) ? viewState.state.currentPage : 0; 

    /* Other Code */ 
} 

Meine Fabrik-Code ist dieses:

app.factory("viewState", [function(){ 
    return { 
     state : {}, 
     data : {} 
    }; 
}]) 

So folgenden einige Führer ich mein Testcode schreiben:

describe('Address Book Controller Testing', function() { 
    var $scope; 
    var controller; 
    var viewStateMock; 

    beforeEach(function() { 

     module('address'); 
     //mocking factories for test 
     module(function($provide){ 
      $provide.factory('viewState', function() { 
        return { 
         prova: function() { 
          return { 
           state : {}, 
           data : {} 
          }; 
         } 
        }; 
       }); 
      }); 
      }); 

     beforeEach(inject(function ($rootScope, $controller, viewState) { 
      $scope = $rootScope.$new(); 
      viewStateMock = viewState; 
      spyOn(viewStateMock, 'prova').and.callThrough(); 
      controller = $controller('AddressBookController', { 
       $scope: $scope, 
       viewState: viewStateMock 
      }); 
     })); 

     describe('All initialized', function(){ 

      it('$scope should be defined', function() { 
       expect($scope).toBeDefined(); 
      }); 

     }); 

    }); 
}); 

Aber wenn ich meinen Test jedes Mal starte, gib mir diesen Fehler:

TypeError: Cannot read property 'pages' of undefined 

Ich stelle fest, dass der Fehler werfen, wenn der Teil des Codes ausgeführt wird:

controller = $controller('AddressBookController', { 
    $scope: $scope, 
    viewState: viewStateMock 
}); 

Und mehr, wenn ich vor diesem Teil des Codes auf der Konsole $ scope drucke ich die „pageLimit“ proprety finden .

Wie kann ich mit meinem Test fortfahren?

Vielen Dank für Ihre Antwort.

Antwort

1

Das Problem ist nicht mit Ihrer $scope Injektion, aber mit Bereitstellung der viewState.

Wenn Sie $provide.factory() verwenden, bauen Sie tatsächlich eine Fabrik (und stellen sie bereit). so sollte die Syntax das gleiche wie Ihr Werk sein:

module(function($provide) { 
    $provide.factory('viewState', function() { 
     return { 
      state: {}, 
      data: {} 
     }; 
    }); 
}); 

jsFiddle sehen.

+0

Vielen Dank! Ich stelle mir vor, ich hätte ein ähnliches Problem. – Roberto

Verwandte Themen