2014-10-16 17 views
0

Jasmine에서 테스트를 실행할 때 오류가 발생합니다. 모의 아약스 호출 테스트를 만들려고합니다. 데이터 자체는 중요하지 않습니다. 테스트를 실행하고 싶습니다. 재스민의TypeError : 정의되지 않은 '_scope'속성을 읽을 수 없습니다.

export interface IMockScope extends ng.IScope { 
 
     promotion: any; 
 
     prometricId: string; 
 
    } 
 

 
    export class MockController { 
 

 
     private _mockService: MockService; 
 
     private _scope: IMockScope; 
 

 
     constructor($scope: IMockScope, mockService: MockService) { 
 

 
      // assigning scope and service 
 
      this._mockService = mockService; 
 

 
      if ($scope === undefined) { 
 
       throw ("exception"); 
 
      } 
 
      if (typeof($scope) === "MockController") { 
 
       console.log("I am the right type"); 
 
      } 
 
      this._scope = $scope; 
 

 
      // getting a prometric ID for the promotion to load 
 
      this._scope.prometricId = "xxx"; 
 

 

 
      // loading a promotion through a service call 
 
      this._mockService.GetPromotion(this._scope.prometricId).then(function (data: any) { 
 
       this._scope.promotion = data; 
 
      }, null); 
 

 
     } 
 
    } 
 

 
    export class MockService { 
 

 
     private _$http: ng.IHttpService; 
 
     private _$q: ng.IQService; 
 

 
     constructor($http: ng.IHttpService, $q: ng.IQService) { 
 
      this._$http = $http; 
 
      this._$q = $q; 
 
     } 
 

 
     GetPromotion(prometricId: string): ng.IPromise<any> { 
 

 
      var deferred = this._$q.defer(); 
 
      var data = { 
 
       prometricId: prometricId 
 
      }; 
 

 
      var promotion: any; 
 

 
      this._$http.get("/PreEval/GetPromotion").then(function (data: any) { 
 
       promotion = data; 
 
       deferred.resolve(promotion); 
 
      }, null); 
 

 
      return deferred.promise; 
 
     } 
 
    } 
 

 
    var mockApp = angular.module('mockApp', []); 
 
    //mockApp.controller('MyController', MyController); 
 
    mockApp.controller('MyController', ["$scope", "mockService", function ($scope: IMockScope, mockService: MockService) { 
 
     return new MockController($scope, mockService); 
 
    }]); 
 

 
    mockApp.factory("mockService", ["$http", "$q", function ($http: ng.IHttpService, $q: ng.IQService) { 
 
     return new MockService($http, $q); 
 
    }]);

내 테스트 : 내 코드

describe("Mock Controller", function() { 
 

 
     var controller: MockController; 
 
     var scope: IMockScope; 
 
     var $http: ng.IHttpService; 
 
     var $q: ng.IQService; 
 
     var mockService: MockService; 
 
     var backEnd: ng.IHttpBackendService; 
 

 
     beforeEach(function() { 
 
      angular.mock.module("mockApp"); 
 
     }); 
 

 
     beforeEach(angular.mock.inject(function ($rootScope: ng.IRootScopeService, _$http_: ng.IHttpService, _$q_: ng.IQService, 
 
            _mockService_: MockService, $httpBackend: ng.IHttpBackendService) { 
 

 
      scope = <IMockScope> $rootScope.$new(); 
 
      $http = _$http_; 
 
      $q = _$q_; 
 
      mockService = _mockService_; 
 
      backEnd = $httpBackend; 
 

 
      backEnd.when("GET", "/PreEval/GetPromotion").respond(
 
       { 
 
        "Success": true, 
 
        "ErrorMessage": "", 
 
        "Result": [ 
 
         { "ContactTypeId": 2, "Name": "Coworker" }, 
 
         { "ContactTypeId": 3, "Name": "Family" }, 
 
         { "ContactTypeId": 5, "Name": "Fresh" }, 
 
         { "ContactTypeId": 1, "Name": "Friend" } 
 
        ] 
 
       }); 
 

 
     })); 
 

 

 
     it("should have data",() => { 
 
      
 
      controller = new MockController(scope, mockService); 
 
      backEnd.flush(); 
 
      expect(scope.promotion).toBeDefined(); 
 
     }); 
 

 
    }); 
 
}

내가 비슷한 질문을보고 시도했지만 아무것도 도왔다. 모든 제안을 부탁드립니다.

답변

1
 this._mockService.GetPromotion(this._scope.prometricId).then(function (data: any) { 
      this._scope.promotion = data; 
     }, null); 

여기서 함수 내에서 this 컨텍스트가 손실됩니다. 대신 화살표 기능을 사용하십시오.

 this._mockService.GetPromotion(this._scope.prometricId).then(data => { 
      this._scope.promotion = data; 
     }, null); 
+0

완벽합니다. 감사 –

관련 문제