Жасмин 2 - Асинхронный обратный вызов не был вызван в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL

У вас возникли проблемы с жасмином 2 и получением асинхронных спецификаций:

define(['foo'], function(foo) {
  return describe('foo', function() {
    beforeEach(function(done) {
      window.jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
      return setTimeout((function() {
        console.log('inside timeout');
        return done();
      }), window.jasmine.DEFAULT_TIMEOUT_INTERVAL);
    });
    return it('passes', function() {
      return expect({}).toBeDefined();
    });
  });
});

Когда я бегу через карму, я возвращаюсь

Ошибка: Тайм-аут - Обратный вызов Async не вызывается в течение таймаута указанный jasmine.DEFAULT_TIMEOUT_INTERVAL.

а затем спецификации не работают. Я попытался переопределить таймаут по умолчанию, но я не могу пройти мимо ошибки

Ответы

Ответ 1

Вы используете тот же интервал времени ожидания, что и Jasmine, чтобы использовать тесты с отказом при тайм-ауте, т.е. ваш тайм-аут запускается с использованием стандартного интервала Jasmine, который не проходит тест.

Если вы установите время ожидания меньше, чем истечение времени ожидания жасмина, тест проходит.

describe('foo', function () {
    beforeEach(function (done) {
        window.jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
        setTimeout(function () {
            console.log('inside timeout');
            done();
        }, 500);
    });
    it('passes', function () {
        expect({}).toBeDefined();
    });
});

Смотрите скрипку здесь

Ответ 2

Мои 2 цента. Я также получил эту ошибку, упомянутую в вопросе в другом сценарии.

У меня была очень простая спецификация:

describe('login feature', function() {
    it('should show the logged in user name after successful login', function(done) {
        expect({}).toBeDefined();
        //done(); // if you don't call this done here, then also above error comes
    });
});

См. прокомментированную функцию //done () в 'it'

Ответ 3

Другим вариантом, который может сработать для вас, является использование async

Асинхронная функция является одной из утилит тестирования Angular и должна быть импортирована... Она принимает функцию без параметров и возвращает функцию, которая становится истинным аргументом функции beforeEach

Тело аргумента async похоже на тело синхронного beforeEach. В этом нет ничего очевидного асинхронного. Например, он не возвращает обещание, и нет никакой функции для вызова, как это было бы при стандартных асинхронных тестах Jasmine. Внутренне асинхронно организует для тела beforeEach для запуска в специальной асинхронной тестовой зоне, которая скрывает механику асинхронного выполнения.

Смотрите: https://angular.io/docs/ts/latest/guide/testing.html#!#async-in-before-each

describe('Component: MyComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      providers: [
        {provide: MyService, useValue: MyServiceMock()},
      ]
    })
    // Using webpack through Angular Cli. You may need ".compileComponents()"
    fixture = TestBed.createComponent(MyComponent)
    component = fixture.componentInstance
    // Initialize the component
    component.ngOnInit()
    fixture.detectChanges()
  }))

  it('should show the logged in user name after successful login',() {
      expect({}).toBeDefined()
  })
})