В Jasmine для тестирования асинхронного кода предусмотрены механизмы
setup и teardown, позволяющие
выполнять подготовку и очистку окружения до и после выполнения тестов.
Основными функциями являются beforeEach,
afterEach, beforeAll и afterAll.
Они поддерживают асинхронные операции через callback,
Promise или async/await.
beforeEach выполняется перед каждым it в
текущем describe, а afterEach — после каждого.
Для асинхронного кода можно использовать три подхода:
donebeforeEach(function(done) {
setTimeout(function() {
// подготовка данных
done(); // сигнал Jasmine о завершении
}, 100);
});
afterEach(function(done) {
setTimeout(function() {
// очистка данных
done();
}, 100);
});
done обязателен.done приведет к тайм-ауту теста.beforeEach(() => {
return fetchDataFromServer().then(data => {
this.data = data;
});
});
afterEach(() => {
return cleanupResources();
});
beforeEach(async () => {
this.data = await fetchDataFromServer();
});
afterEach(async () => {
await cleanupResources();
});
beforeAll выполняется один раз перед всеми тестами
внутри describe, afterAll — один раз после
всех тестов. Асинхронные возможности идентичны
beforeEach/afterEach.
Пример:
beforeAll(async () => {
this.server = await startTestServer();
});
afterAll(async () => {
await this.server.stop();
});
this сохраняется внутри
функций function() {}. Использование стрелочных функций
(() => {}) может изменить контекст, поэтому при доступе
к this внутри beforeEach или
afterEach рекомендуется использовать обычные функции.beforeEach/afterEach — 5
секунд. Можно изменить с помощью
jasmine.DEFAULT_TIMEOUT_INTERVAL.done.fail(err) или отклонённый Promise.beforeEach((done) => {
fetchData().then(data => {
this.data = data;
done();
}).catch(err => done.fail(err));
});
describe('Асинхронная подготовка и очистка', () => {
beforeAll(async () => {
this.globalResource = await initializeGlobalResource();
});
beforeEach((done) => {
setupLocalData(this.globalResource).then(() => done());
});
it('тест с асинхронными операциями', async () => {
const result = await performAsyncTask(this.globalResource);
expect(result).toBe(true);
});
afterEach(() => cleanupLocalData(this.globalResource));
afterAll(async () => {
await this.globalResource.shutdown();
});
});
async/await и done
для демонстрации гибкости.beforeEach/afterEach с async/await.beforeAll/afterAll.try/catch или catch у Promise, чтобы Jasmine
корректно регистрировал неудачные тесты.Асинхронные setup и teardown позволяют создавать устойчивые, предсказуемые тестовые окружения, исключая состояние между тестами и упрощая работу с внешними ресурсами. Это критически важно для тестирования приложений с сетью, базой данных или любыми асинхронными зависимостями.