Замороженное обещание в юнит-тесте

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() после создания цепочки обещаний. Любой более новый, then s, потребует запуска другого дайджеста.
  • 0
    Спасибо, у вас все в порядке (Estus, Radek Wyroslak и doge1ord). Я понятия не имел, что обещания $ q являются синхронными и требуют дайджеста для работы.
Теги:
jasmine
ngmock

2 ответа

1
Лучший ответ

Вам нужно использовать $ scope. $ Apply() (или $ rootScope. $ Digest()) и определить then() перед вызовом. Я изменил ваш пример:

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();
    });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню