asyncне дозволить розпочати наступний тест, поки не виконає asyncвсі свої завдання. Що asyncозначає обернути зворотний виклик у Зону, де setTimeoutвідстежуються всі асинхронні завдання (наприклад ). Як тільки всі асинхронні завдання будуть завершені, тоді asyncвиконується.
Якщо ви коли-небудь працювали з Жасмином за межами Angular, можливо, ви бачили, doneяк передавали зворотний дзвінок
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
Ось це рідна жасмин, де ми говоримо Жасмин, що цей тест повинен затримати завершення, поки ми не зателефонуємо done(). Якби ми не зателефонували done()і замість цього зробили це:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
Тест завершиться ще до очікування, оскільки обіцянка вирішується після закінчення тесту, виконуючи синхронні завдання.
З Angular (в середовищі жасмину), Angular насправді буде дзвонити doneза куліси, коли ми використовуємо async. Він буде відстежувати всі асинхронні завдання в Зоні, і коли вони будуть закінчені, doneбуде викликаний за кадром.
У вашому конкретному випадку з TestBedконфігурацією ви зазвичай використовуєте це, коли хочете compileComponents. Я рідко потрапляю в ситуацію, коли мені доводиться називати це інакше
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
При тестуванні компонента, який використовує templateUrl (якщо ви не використовуєте веб-пакет), тоді Angular повинен зробити запит XHR, щоб отримати шаблон, тому компіляція компонента буде асинхронною. Тому нам слід почекати, поки він не вирішиться, перш ніж продовжувати тестування.
asyncце не обов’язково. Коли ви використовуєтеtemplateUrl, це так. Однак включенняasyncне буде "зламати" компонент вбудованого шаблону. Як ви вважаєте, чи можна з упевненістю сказати, що можна просто за замовчуванням використовуватиasyncдля кожного тесту?