Глобальні методи
Під час виконання тестів, Jest додає кожен з цих мето дів і об’єктів в глобальну область видимості. Вам не потрібно нічого підключати або імпортувати, щоб їх використовувати. Проте, якщо ви надаєте перевагу явним імпортам, ви можете робити це з допомогою import {describe, expect, test} from '@jest/globals'
.
Приклади TypeScript з цієї сторінки будуть працювати, як задокументовано, тільки якщо ви явно імпортуєте Jest API:
import {expect, jest, test} from '@jest/globals';
Інструкцію щодо налаштування Jest за допомогою TypeScript можна знайти на сторінці Початок роботи.
Методи
- Довідка
afterAll(fn, timeout)
afterEach(fn, timeout)
beforeAll(fn, timeout)
beforeEach(fn, timeout)
describe(name, fn)
describe.each(table)(name, fn, timeout)
describe.only(name, fn)
describe.only.each(table)(name, fn)
describe.skip(name, fn)
describe.skip.each(table)(name, fn)
test(name, fn, timeout)
test.concurrent(name, fn, timeout)
test.concurrent.each(table)(name, fn, timeout)
test.concurrent.only.each(table)(name, fn)
test.concurrent.skip.each(table)(name, fn)
test.each(table)(name, fn, timeout)
test.failing(name, fn, timeout)
test.failing.each(name, fn, timeout)
test.only.failing(name, fn, timeout)
test.skip.failing(name, fn, timeout)
test.only(name, fn, timeout)
test.only.each(table)(name, fn)
test.skip(name, fn)
test.skip.each(table)(name, fn)
test.todo(name)
- Використання TypeScript
Довідка
afterAll(fn, timeout)
Запускає функцію після завершення усіх тестів у цьому файлі. Якщо функція повертає проміс, або генератор, Jest очікує на виконання цього промісу, перш ніж продовжити.
Додатково, ви можете вказати timeout
(у мілісекундах) на те як довго чекати перед перериванням. За замовчуванням, тайм-аут становить 5 секунд.
Часто це буває корисним, якщо ви хочете очистити певний глобальний стан, спільний для різних тестів.
Наприклад:
const globalDatabase = makeGlobalDatabase();
function cleanUpDatabase(db) {
db.cleanUp();
}
afterAll(() => {
cleanUpDatabase(globalDatabase);
});
test('can find things', () => {
return globalDatabase.find('thing', {}, results => {
expect(results.length).toBeGreaterThan(0);
});
});
test('can insert a thing', () => {
return globalDatabase.insert('thing', makeThing(), response => {
expect(response.success).toBeTruthy();
});
});
В цьому коді afterAll
гарантує, що cleanUpDatabase
буде викликано після запуску усіх тестів.
Якщо afterAll
знаходиться всередині describe
блоку, функція виконується в кінці цього блоку.
Якщо ви хочете виконати очистку після кожного тесту, використовуйте afterEach
натомість.
afterEach(fn, timeout)
Запускає функцію після завершення кожного тесту в цьому файлі. Якщо функція повертає проміс, або генератор, Jest очікує на виконання цього промісу, перш ніж продовжити.
Додатково, ви можете вказати timeout
(у мілісекундах) на те як довго чекати перед перериванням. За замовчуванням, тайм-аут становить 5 секунд.
Наприклад:
Наприклад:
const globalDatabase = makeGlobalDatabase();
function cleanUpDatabase(db) {
db.cleanUp();
}
afterEach(() => {
cleanUpDatabase(globalDatabase);
});
test('can find things', () => {
return globalDatabase.find('thing', {}, results => {
expect(results.length).toBeGreaterThan(0);
});
});
test('can insert a thing', () => {
return globalDatabase.insert('thing', makeThing(), response => {
expect(response.success).toBeTruthy();
});
});
Тут afterEach
забезпечує запуск cleanUpDatabase
після кожного відпрацьованого тесту.
Якщо afterEach
знаходиться всередині describe
, то функція запуститься після виконання усіх тестів у цьому describe
блоку.
Якщо ви хочете виконати певну очистку тільки один раз після виконання всіх тестів, використовуйте afterAll
.
beforeAll(fn, timeout)
Виконує функцію до запуску тестів в цьому файлі. Якщо функція повертає проміс, або генератор, Jest очікує на виконання цього промісу, перш ніж запускати тести.
Додатково, ви можете вказати timeout
(у мілісекундах) на те як довго чекати перед перериванням. За замовчуванням, тайм-аут становить 5 секунд.
Наприклад:
Наприклад:
const globalDatabase = makeGlobalDatabase();
beforeAll(() => {
// Очищає базу даних і додає деякі тестові дані.
// Jest чекатиме поки цей проміс буде виконано перед запуском тестів.
return globalDatabase.clear().then(() => {
return globalDatabase.insert({testData: 'foo'});
});
});
// Оскільки ми створили базу даних тільки один раз, в цьому прикладі, то важливо
// щоб наші тести не змінювали її
test('can find things', () => {
return globalDatabase.find('thing', {}, results => {
expect(results.length).toBeGreaterThan(0);
});
});
Тут beforeAll
гарантує, що база даних буде створена, перед запуском тестів. Якщо налаштування були синхронними, ви можете зробити це без beforeAll
. Основна перевага полягає в тому, що Jest чекатиме, поки виконається проміс, що дозволяє використання асинхронних налаштувань.
Якщо beforeAll
знаходиться всередині describe
блоку, функція запуститься на початку цього блоку.
Якщо ви хочете виконувати якісь команди перед запуском кожного тесту, використовуйте beforeEach
натомість.
beforeEach(fn, timeout)
Запускає функцію перед виконанням кожного тесту в цьому файлі. Якщо функція повертає проміс, або генератор, Jest очікує на виконання цього промісу, перш ніж запускати тест.
Додатково, ви можете вказати timeout
(у мілісекундах) на те як довго чекати перед перериванням. За замовчуванням, тайм-аут становить 5 секунд.
Наприклад:
Наприклад:
const globalDatabase = makeGlobalDatabase();
beforeEach(() => {
// Очищує базу даних та додає деякі тестові дані.
// Jest чекатиме поки цей проміс буде виконано перед запуском тестів.
return globalDatabase.clear().then(() => {
return globalDatabase.insert({testData: 'foo'});
});
});
test('can find things', () => {
return globalDatabase.find('thing', {}, results => {
expect(results.length).toBeGreaterThan(0);
});
});
test('can insert a thing', () => {
return globalDatabase.insert('thing', makeThing(), response => {
expect(response.success).toBeTruthy();
});
});
Тут beforeEach
забезпечує приведення бази до початкового стану, перед запуском кожного тесту.
Якщо функція beforeEach
знаходиться всередині describe
блоку, то вона запуститься для кожного тесту в describe
блоці.
Якщо вам потрібно виконати певні налаштування лише один раз перед запуском всіх тестів, використовуйте beforeAll
натомість.
describe(name, fn)
describe(name, fn)
створює блок, який групує кілька пов'язаних тестів. Наприклад, якщо у вас є об’єкт myBeverage
який повинен мати власт ивість delicious
і не мати властивості sour
, ви можете протестувати це так:
const myBeverage = {
delicious: true,
sour: false,
};
describe('my beverage', () => {
test('is delicious', () => {
expect(myBeverage.delicious).toBeTruthy();
});
test('is not sour', () => {
expect(myBeverage.sour).toBeFalsy();
});
});
Але це не обов'язково. Ви можете продовжувати використовувати test
блоки на верхньому рівні. Натомість це може бути досить зручно, якщо ви надаєте перевагу організації тестів по групах.
Ви також можете вкладати блоки describe
один в одного якщо у вас є ієрархія тестів:
const binaryStringToNumber = binString => {
if (!/^[01]+$/.test(binString)) {
throw new CustomError('Not a binary number.');
}
return parseInt(binString, 2);
};
describe('binaryStringToNumber', () => {
describe('given an invalid binary string', () => {
test('composed of non-numbers throws CustomError', () => {
expect(() => binaryStringToNumber('abc')).toThrow(CustomError);
});
test('with extra whitespace throws CustomError', () => {
expect(() => binaryStringToNumber(' 100')).toThrow(CustomError);
});
});
describe('given a valid binary string', () => {
test('returns the correct number', () => {
expect(binaryStringToNumber('100')).toBe(4);
});
});
});
describe.each(table)(name, fn, timeout)
Використовуйте describe.each
якщо дублюєте один і той самий тест з різними даними. describe.each
дозволяє написати тест один раз і далі передавати в нього дані.
describe.each
доступний з двома API:
1. describe.each(table)(name, fn, timeout)
-
table
:Array
масивів з аргументами, які передаються в функціюfn
для кожного рядка. Якщо ви передасте 1D масив примітивів, його буде перетворено на таблицю, тобто[1, 2, 3] -> [[1], [2], [3]]
. -
name
:String
заголовок тестового набору.- Генеруйте унікальні заголовки тестів за допомогою позиційних вбудованих параметрів за допомогою
printf
formatting:%p
- pretty-format.%s
- Рядок (String).%d
- Число (Number).%i
- Ціле число (Integer).%f
- Число з плаваючою комою (Floating point value).%j
- JSON.%o
- Об'єкт (Object).%#
- Index of the test case.%%
- single percent sign ('%'). Це не розглядається як аргумент.
- Або ж генеруйте унікальні заголовки тестів шляхом впровадження властивостей об'єкту теста за допомогою
$variable
- Для введення значень вкладеного об'єкта, можна зазначити keyPath, тобто
$variable.path.to.value
- Ви можете використати
$#
для додавання індексу тесту - You cannot use
$variable
with theprintf
formatting except for%%
- Для введення значень вкладеного об'єкта, можна зазначити keyPath, тобто
- Генеруйте унікальні заголовки тестів за допомогою позиційних вбудованих параметрів за допомогою
-
fn
:Function
набір тестів для виконання; функція, що отримуватиме параметри у вигляді аргументів функції в кожному рядку. -
Додатково, ви можете надати
timeout
(у мілісекундах), щоб вказати, як довго чекати кожного рядка перед перериванням. За замовчуванням, тайм-аут становить 5 секунд.
Example:
describe.each([
[1, 1, 2],
[1, 2, 3],
[2, 1, 3],
])('.add(%i, %i)', (a, b, expected) => {
test(`returns ${expected}`, () => {
expect(a + b).toBe(expected);
});
test(`returned value not be greater than ${expected}`, () => {
expect(a + b).not.toBeGreaterThan(expected);
});
test(`returned value not be less than ${expected}`, () => {
expect(a + b).not.toBeLessThan(expected);
});
});
describe.each([
{a: 1, b: 1, expected: 2},
{a: 1, b: 2, expected: 3},
{a: 2, b: 1, expected: 3},
])('.add($a, $b)', ({a, b, expected}) => {
test(`returns ${expected}`, () => {
expect(a + b).toBe(expected);
});
test(`returned value not be greater than ${expected}`, () => {
expect(a + b).not.toBeGreaterThan(expected);
});
test(`returned value not be less than ${expected}`, () => {
expect(a + b).not.toBeLessThan(expected);
});
});