Подтвердить что ты не робот

Angular 2 Тестирование - вызов функции Async - когда использовать

Когда вы используете функцию async в TestBed при тестировании в Angular 2?

Когда вы используете это?

 beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [MyModule],
            schemas: [NO_ERRORS_SCHEMA],
        });
    });

и когда вы используете это?

beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [MyModule],
            schemas: [NO_ERRORS_SCHEMA],
        });
    }));

Может ли кто-нибудь просветить меня по этому поводу?

4b9b3361

Ответ 1

async позволит следующий тест не запускаться до тех пор, пока async не закончит все задачи. То, что async делает, - это завершение обратного вызова в Зоне, где отслеживаются все асинхронные задачи (например, setTimeout). После завершения всех асинхронных задач завершается async.

Если вы когда-либо работали с Jasmine вне Angular, вы могли видеть, что done передается обратному сообщению

it('..', function(done) {
  someAsyncAction().then(() => {
    expect(something).toBe(something);
    done();
  });
});

Вот, это родной Жасмин, где мы говорим Жасмину, что этот тест должен отложить завершение, пока мы не назовем done(). Если мы этого не сделали,

it('..', function() {
  someAsyncAction().then(() => {
    expect(something).toBe(something);
  });
});

Тест завершится еще до ожидания, потому что обещание решает после завершения теста выполнения синхронных задач.

С Angular (в среде Jasmine) Angular на самом деле вызовет done за кулисами, когда мы будем использовать async. Он будет отслеживать все асинхронные задачи в Зоне, и когда все будет готово, done будет вызываться за кулисами.

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

beforeEach(async(() => {
   TestBed.configureTestingModule({
     declarations: [MyModule],
     schemas: [NO_ERRORS_SCHEMA],
   })
   .compileComponent().then(() => {
      fixture = TestBed.createComponent(TestComponent);
   });
}));

При тестировании компонента, использующего templateUrl (если вы не используете webpack), Angular должен сделать запрос XHR для получения шаблона, поэтому компиляция компонента будет асинхронной. Поэтому мы должны подождать, пока он решит продолжить тестирование.

Ответ 2

Когда вы выполняете асинхронный вызов в своем тесте, фактическая тестовая функция завершается до завершения асинхронного вызова. Когда вам нужно проверить какое-либо состояние, когда вызов был завершен (как правило, это так), тогда тестовая среда сообщит об окончании теста, пока продолжается асинхронная работа.

С помощью async(...) вы скажите платформе тестирования дождаться завершения обещания по возврату или наблюдаемого до завершения теста.

it('should show quote after getQuote promise (async)', async(() => {
  fixture.detectChanges();

  fixture.whenStable().then(() => { // wait for async getQuote
    fixture.detectChanges();        // update view with quote
    expect(el.textContent).toBe(testQuote);
  });
}));

Код, переданный в then(...), будет выполнен после, сама тестовая функция. С помощью async() вы заставляете тестовую инфраструктуру знать, что ей нужно дождаться завершения promises и наблюдаемых до завершения теста.

См. также