2014-06-20 3 views
2

나는 $ q.all을 사용하여 하나의 약속으로 포장 한 다음 약속이 모두 동시에 해결되는지 테스트하는 단위 테스트를 작성하려고합니다. 난 그냥이 약속을 모두 포함하는 하나의 약속으로 이동 한 후 해결 될 필요가 실제로 여기에 아무것도에 대한 GET 요청을 사용하지 않으 Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. :이약속을위한 각도 재스민 단위 테스트

describe("Application controller", function() { 
    var scope; 
    var controller; 

    beforeEach(module('my.namespace')); 
//this suite can be removed. 
    describe("Application ", function() { 
     beforeEach(
      inject(function ($rootScope, $controller,$q) { 
       scope = $rootScope.$new(); 
       controller = $controller('Application', { 
        '$scope': scope 
       }); 
      })); 


     it("should package two promises into one", function (done) { 
      inject(function ($rootScope) { 
       setTimeout(function() { 
        $rootScope.$apply(function() { 
         var promiseOne = $q.defer(), 
          //promiseOneData; 
          promiseTwo = $q.defer(); 
          //promiseTwoData 
         promiseOne.then(function(data){ 
          promiseOne.resolve('promiseOne'); 
          expect(1).toBe(1); 
         }); 
         promiseTwo.then(function(data){ 
          promiseTwoData.resolve('promiseTwo'); 
         }) 
         var allPromises = $q.all([promiseOne,promiseTwo]); 
         allPromises.then(function(data){ 
          //data should contain an array of two empty elements for each promise 
          expect(data.length).toBe(2); 
         }); 
         done(); 
        }); 
       }, 1000); 


    }) 
}); 

가 나는 오류가 발생합니다. 각과 재스민으로 어떻게 할 수 있습니까?

답변

1

당신이 원하는 것은 아마도 스파이이며 그것이 호출되었는지 아닌지 확인하는 것입니다.

describe('test $q', function() { 
    var 
    $scope; 
    $controller; 
    $httpBackend; 

    beforeEach(function() { 
    module('myModule'); 
    inject(function(_$rootScope_, _$controller_) { 
     $scope = _$rootScope_.$new(); 
     $controller = _$controller_; 
     $controller ('MyCtrl', { 
      $scope: $scope 
     }); 
    }); 

    it('should test that $q.all calls callback when dependent promises are resolved', function() { 
    var deferOne = $q.defer(), 
     deferTwo = $q.defer(); 
     combinedSpy = jasmine.createSpy('combined');  

    $q.all([deferOne.promise, deferTwo.promise]).then(combinedSpy); 

    expect(combinedSpy).toNotHaveBeenCalled(); 
    deferOne.resolve(); 
    deferTwo.resolve(); 
    $scope.apply(); 
    expect(combinedSpy).toHaveBeenCalled(); 
    }); 

이 테스트 제목은 매우 혼란 스럽지만 약속을 시뮬레이트하지 않습니다. 당신은 약속을 시험하고 있습니다. 그리고 당신은 꼭 Angular 자체에서 $ q에 대한 테스트가 있습니다. 그래서 테스트를 쓰는 데는 아무런 의미가 없습니까?

wrapping them up into one with $q.all

이렇게하면 세 번째 약속이 생깁니다. 세 번째 약속은 A와 B 약속이 모두 해결되면 해결됩니다.

test that the promises are both resolved at the same time

JavaScript는 단일 스레드이므로 동시에 해결할 수 없습니다. $ q.all()에 의해 생성 된 세 번째 약속은 첫 번째와 두 번째가 모두 해결되면 해결됩니다. 해결 될 A와 B 사이의 시간이 지날 수 있습니다.

A가 해결되었다고 말하면 1 시간 후 B가 해결됩니다. 그런 다음 C ($ q.all)는 다음 다이제스트주기 ($ scope.apply()에 의해)에서 해결됩니다.

+0

이 답변의 많은이 할 수없는 어떤 사람을 말한다 점에서 유용하다; 그러나 그 테스트가 실제로 대신 어떻게 보이게해야합니까? 그것은 사람들에게 그들이해야 할 것을 보여주기위한 진짜 유용한 대답입니다. –

+0

글쎄, 그가하고 싶은 일은 할 수 없으니, 시험은 어떻게 생겼을 까? JS에서 동시에 두 가지 일을 할 수 있다는 전제는 잘못되었습니다. 또한 질문은 그가 진짜로 원하는 것을 불분명하게하고 질문은 개선되지 않았습니다. 약속이 해결되었는지 테스트하는 것은 보통 스파이들과 함께하는 것이 가장 좋습니다.이 질문을보십시오. http://stackoverflow.com/questions/26319873/how-to-test-value-returned-in-promise-from-angularjs-controller-with-jasmine/26328984#26328984 – oldwizard

0

이는 영업 이익의 대답은 그들이 질문에 붙여 넣을 것입니다 :

it("Should simulate promise",inject(function($q, $rootScope){ 
      var deferred = $q.defer(); 
      var promise = deferred.promise; 
      var resolvedValue; 
      promise.then(function(value){ 
       resolvedValue = value; 
      }); 
      //made no promises yet 
      expect(resolvedValue).toBeUndefined(); 
      var application = { 
       id: '123', 
       name: 'suebalu', 
       database: '234', 
       folder: 'c:', 
       version: '1.2', 
       file: 'previewPubFile', 
       date: '2009-01-01' 
      }; 

      deferred.resolve({ 
       id: '123', 
       name: 'suebalu', 
       database: '234', 
       folder: 'c:', 
       version: '1.2', 
       file: 'previewPubFile', 
       date: '2009-01-01' 
      }); 
      $rootScope.$apply(); 
      expect(resolvedValue).toEqual(application); 
     })); 
관련 문제