2016-04-08 14 views
11

Tôi đã cố gắng dò tìm một chức năng đã được thực thi khi khởi tạo bộ điều khiển, nhưng kiểm tra luôn thất bại. Tôi đã thử thực hiện $scope.$digest() và điều này không hoạt động, Tuy nhiên trong giao diện điều khiển, tôi thấy rằng hàm đã được gọi.Kiểm tra góc: Gián điệp một chức năng đã được thực thi khi khởi tạo bộ điều khiển

Tôi không thể tìm ra điều này, Ai đó có thể giải thích cho tôi lý do tại sao tính năng này không hoạt động?

Codepen Ví dụ: http://codepen.io/gpincheiraa/pen/KzZNby

khiển

function Controller($stateParams, $scope){ 

    $scope.requestAuthorization = requestAuthorization; 

    if ($stateParams.requestAuthorization === true) { 
    console.log('$stateParams.requestAuthorization'); 
    $scope.requestAuthorization(); 
    } 
    function requestAuthorization() { 
    console.log('requestAuthorization()'); 
    } 
} 

Testing

describe('AppCtrl', function(){ 
    var AppCtrl, $rootScope, $scope, $stateParams; 

    beforeEach(module('exampleApp')); 

    beforeEach(inject(function($controller, _$rootScope_, _$injector_, _$stateParams_) { 
     $rootScope = _$rootScope_; 
     $scope = $rootScope.$new(); 
     $stateParams = _$stateParams_; 
     $stateParams.requestAuthorization = true; 


     AppCtrl = $controller('AppCtrl',{ 
      $scope: $scope, 
      $stateParams : $stateParams 
     }); 

     spyOn($scope, 'requestAuthorization');   
    })); 

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

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

    // this test is not passing.. 
    it('should call requestAuthorization', function() { 
       //$scope.$digest(); 
     expect($scope.requestAuthorization).toHaveBeenCalled(); 
    }); 

}); 
+0

Tôi tin rằng bạn sẽ phải khởi tạo bộ điều khiển trong trường hợp thử nghiệm chính nó, spyOn nó trước khi khởi tạo của bộ điều khiển, sau đó kiểm tra kết quả mong đợi sau. – northsideknight

Trả lời

7

thử nghiệm của bạn là không vì gián điệp được ghi đè bởi chức năng thực sự khi điều khiển khởi. Một cách để tránh điều này là khỉ-vá $scope đối tượng với setter tùy chỉnh cho requestAuthorization bất động sản, mà có thể tạo ra gián điệp khi điều khiển đang cố gắng để gán giá trị cho khách sạn này:

beforeEach(inject(function($controller, _$rootScope_, _$injector_, _$stateParams_) { 
     $rootScope = _$rootScope_; 
     $scope = $rootScope.$new(); 
     var reqAuthSpy; 
     Object.defineProperty($scope, 'requestAuthorization', { 
      get: function() {return reqAuthSpy;}, 
      set: function(fn) { 
      reqAuthSpy = jasmine.createSpy('reqAuthSpy'); 
      } 
     }); 
     $stateParams = _$stateParams_; 
     $stateParams.requestAuthorization = true; 


     AppCtrl = $controller('AppCtrl',{ 
      $scope: $scope, 
      $stateParams : $stateParams 
     }); 

    })); 
Các vấn đề liên quan