source

재스민 유닛 테스트에서 $q. 모든 약속을 어떻게 해결합니까?

ittop 2023. 4. 2. 11:54
반응형

재스민 유닛 테스트에서 $q. 모든 약속을 어떻게 해결합니까?

컨트롤러의 코드는 다음과 같습니다.

$q.all([qService.getData($scope.id), dService.getData(), qTService.get()])
.then(function (allData) {
  $scope.data1 = allData[0];
  $scope.data2 = allData[1];
  $scope.data3 = allData[2];
});

유닛 테스트에서는 다음과 같은 작업을 하고 있습니다.

beforeEach(inject(function($rootScope, $q, $location){// and other dependencies... 
  qServiceSpy = spyOn(_qService, 'getData').andCallFake(function () {
    var data1 = {
      id: 1,
      sellingProperty: 1,
    };
    var d = $q.defer();
    d.resolve(data1);
    return d.promise;
  });

  dServiceSpy = spyOn(_dService, 'getData').andCallFake(function () {
    var data2 = [{ "id": "1", "anotherProp": 123 }];
    var d = $q.defer();
    d.resolve(data2);
    return d.promise;
  });
  qTServiceSpy = spyOn(_qTService, 'get').andCallFake(function () {
    var data3 = [{ id: 0, name: 'Rahul' }];
    var d = $q.defer();
    d.resolve(data3);
    return d.promise;
  });
  rootScope = $rootScope;
});

이 테스트에서는 서비스가 호출되어 data1, data2가 정의되어 있지 않은지 확인합니다.

it('check if qService' got called, function() {
  expect(scope.data1).toBeUndefined();
  rootScope.$digest();
  expect(_quoteService.getQuote).toHaveBeenCalled();
});
it('check if "data1" is defined', function () {
  expect(scope.data1).toBeUndefined();
  rootScope.$digest();
  expect(scope.data1).toBeDefined();
});

문제는 컨트롤러의 개별 서비스 콜을 Q.all 및 테스트에서 교체할 때까지 정상적으로 동작하고 있었다는 것입니다.scope.$apply와 함께rootScope.$digestq.all과rootScope.$digest(사용방법)scope.$apply또한) 두 테스트 모두 오류로 인해 실패합니다.

$420() 반복 횟수 10에 도달했습니다.중단!

제거한다면rootScope.$digest그러면 약속은 절대 해결되지 않고 테스트는 실패한다.

정의되지 않은 정의입니다.

도움말이 있으면 유닛에서 코드를 테스트하는 방법q.all?

우연히 이 포스트를 발견했다

하지만 그것 또한 도움이 되지 않는다 왜냐하면 나는 이미 사용하려 하고 있기 때문이다.$digest.

퍼팅을 시도해 보세요.$rootScope.$apply()에 있어서afterEach()콜백 함수약속 해결 날짜:$apply()앵귤러로.

afterEach(function(){
    rootScope.$apply();
});

언급URL : https://stackoverflow.com/questions/16316940/how-to-resolve-q-all-promises-in-jasmine-unit-tests

반응형