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
для кожного тесту?