2016-07-30 3 views
0

일반적인 $ q 약속을 반환하는 서비스를 테스트 할 때 이상한 점이 있습니다. 어떤 테스트에서 시도해도 약속이 실제로 해결/거부되지는 않습니다. (더 구체적으로는 then의 핸들러가 호출되지 않습니다. 약속 안의 코드는 정상적으로 실행됩니다.) 나는 심지어 루트 범위에서 다이제스트를 강제 실행하려고 시도했다. 여기 단위 테스트에서 약속 안 함

작은 자체에 포함 된 예는 다음과 같습니다

describe('promise', function(){ 
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 500; 
    let q; 

    beforeEach(inject(function($q){ 
    q = $q; 
    })); 

    it('finishes', function(done){ 
    expect(q).toBeDefined(); 
    const promise = q.resolve(); 
    console.log(promise); 
    promise.then(
    () => done(), 
    () => done.fail() 
    ); 
    }); 
}); 

내가 예상대로 약속 일을하려면 어떻게해야합니까?

+1

약속은 동기식이며 '완료'를 호출 할 필요가 없습니다. promise chain이 성립 된 후'$ rootScope. $ digest()'*. 더 새로운'then'은 다른 다이제스트가 트리거 될 것을 요구할 것입니다. – estus

+0

감사합니다. 괜찮습니다 (estus, Radek Wyroslak and doge1ord). 나는 $ q 약속이 동기이고 일을하기 위해서 다이제스트를 요구한다는 것을 몰랐다. – monnef

답변

1

당신은 $ 범위를 사용하는 데 필요한 유형 선언을 무시합니다. $ 적용() (또는 $ rootScope. $ 다이제스트()) 다음 정의를()를 호출하기 전에. 귀하의 예를 수정했습니다 :

describe('promise', function(){ 
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 500; 
    let q; 
    let scope; 

    beforeEach(inject(function($q, $rootScope){ 
    q = $q; 
    scope = $rootScope.$new(); 
    })); 

    it('finishes', function(done){ 
    expect(q).toBeDefined(); 
    const promise = q.resolve(); 
    promise.then(
    () => done(), 
    () => done.fail() 
    ); 
    scope.$apply(); 
    }); 
}); 
2

이 예제가 $ rootScope. $ digest()를 사용하는 데 도움이되기를 바랍니다. 이미 이미 다이제스트를 강제 실행하려고 시도했음을 알고 있습니다. 그냥 (타이프 라이터를 사용하여 작성되었습니다)

var service: IService; 
    var $rootScope: ng.IRootScopeService; 
    var $q: ng.IQService; 

    beforeEach(() => { 
     angular.mock.module("app"); 
     angular.mock.inject((
      _$rootScope_: ng.IRootScopeService, 
      _$q_: ng.IQService 
     ) => { 
      // Assign dependecies 
      $q = _$q_; 
      $rootScope = _$rootScope_; 
     }); 

     // Initialize service 
     service = new Service($q); 
    }); 


    it("should call errorCallback",() => { 
     let callback = { 
      errorCallback: function (response: any) { /*empty function */ } 
     }; 

     spyOn(callback, "errorCallback"); 

     service.connect(null) 
      .catch(callback.errorCallback); 

     // Trigger a digest on rootScope (needed for $q implementation) 
     $rootScope.$digest(); 

     expect(callback.errorCallback).toHaveBeenCalled(); 
    }); 
관련 문제