2016-07-30 5 views
0

Я ударил странную вещь, пытаясь проверить услугу, возвращающую обычные обещания в $ q. Никакое обещание, которое я пытаюсь в любом тесте, на самом деле никогда не разрешалось/отклонялось (более конкретно обработчики из then не вызываются, код внутри обещаний работает просто отлично). Я даже пытался заставить дайджест на корневой области, как некоторые другие ответы на SO предложил, без всякой удачи.Замороженное обещание в единичном тесте

Вот небольшой самодостаточным пример:

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

$ q обещания синхронны и не требуют вызова 'done'. Просто '$ rootScope. $ Digest()' * после * была создана цепочка обещаний. Любые более новые '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – estus

+0

Спасибо, ты в порядке (эстус, Радек Вирослак и доге). Я понятия не имел, что обещания $ 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(); 
    }); 

 Смежные вопросы

  • Нет связанных вопросов^_^