Об’єкт Jest
Об’єкт jest
автоматично додається в область видимості кожного файла з тестами. Методи, доступні в цому об’єкті, допомагають створювати імітації і дозволяють контролювати загальну поведінку Jest.
Методи #
jest.clearAllTimers()
jest.disableAutomock()
jest.enableAutomock()
jest.fn(implementation)
jest.isMockFunction(fn)
jest.genMockFromModule(moduleName)
jest.mock(moduleName, factory, options)
jest.unmock(moduleName)
jest.doMock(moduleName, factory, options)
jest.dontMock(moduleName)
jest.clearAllMocks()
jest.resetAllMocks()
jest.restoreAllMocks()
jest.resetModules()
jest.runAllTicks()
jest.runAllTimers()
jest.runTimersToTime(msToRun)
jest.runOnlyPendingTimers()
jest.setMock(moduleName, moduleExports)
jest.setTimeout(timeout)
jest.useFakeTimers()
jest.useRealTimers()
jest.spyOn(object, methodName)
Довідка #
jest.clearAllTimers()
#
Видаляє всі заплановані таймери.
Це означає, що якщо були заплановані будь-які таймери (але вони ще не бли виконані), то вони будуть очищені і не будуть виконані в майбутньому.
jest.disableAutomock()
#
Вимикає автоматичну генерацію імітацій в завантажувачі модулів.
Після того, як буде викликаний цей метод, всі виклики require()
будуть повертати реальні версії модулів (замість їх імітацій).
Зазвичай це буває корисно, коли у вас є сценарій, в якому кількість залежностей, для яких потрібно створити імітації, значно менша, ніж тих, для яких імітації не потрібні. Наприклад, якщо ви пишете тест для модуля, який використовує велику кількість залежностей, що можуть бути класифіковані як "деталі реалізації" модуля, тоді вам, схоже, не потрібно створювати імітації для них усіх.
Приклади залежностей, які можуть бути розцінені як "деталі реалізації", починаються з вбудованих методів мови (такі як методи Array.prototype) і закінчуються дуже поширеними допоміжними методами (наприклад underscore/lo-dash) чи, навіть, цілими бібліотеками типу React.js.
Повертає об’єкт jest
для створення ланцюжків викликів.
Примітка: цей метод раніше називався autoMockOff
. Коли ви використовуєте babel-jest
, виклики disableAutomock
будуть автоматично спливати до початку блоку коду. Використовуйте autoMockOff
, якщо ви хочете явно заборонити таку поведінку.
jest.enableAutomock()
#
Вмикає автоматичну генерацію імітацій в завантажувачі модулів.
Повертає об’єкт jest
для створення ланцюжків викликів.
Примітка: цей метод раніше називався autoMockOn
. Коли ви використовуєте babel-jest
, виклики enableAutomock
будуть автоматично спливати до початку блоку коду. Використовуйте autoMockOn
, якщо ви хочете явно заборонити таку поведінку.
jest.fn(implementation)
#
Повертає нову функцію-імітацію. Опціонально приймає її реалізацію.
const mockFn = jest.fn(); mockFn(); expect(mockFn).toHaveBeenCalled(); // з використанням моків: const returnsTrue = jest.fn(() => true); console.log(returnsTrue()); // true;
jest.isMockFunction(fn)
#
Визначає, чи задана функція є імітацією.
jest.genMockFromModule(moduleName)
#
На основі заданого модуля, використовує систему автоматичного створення імітацій для створення імітації модуля.
Це корисно, коли ви хочете створити ручну імітацію, яка розширює поведінку автоматично створеної імітації модуля.
jest.mock(moduleName, factory, options)
#
Створює імітацію модуля, коли він буде підключений. factory
і options
опціональні. Наприклад:
// banana.js module.exports = () => 'banana'; // __tests__/test.js jest.mock('../banana'); const banana = require('../banana'); // banana will be explicitly mocked. banana(); // will return 'undefined' because the function is auto-mocked.
Другий параметр може бути використаний щоб явно вказати фабричний метод модуля, який буде виконано замість автоматичного створення імітації:
jest.mock('../moduleName', () => { return jest.fn(() => 42); }); const moduleName = require('../moduleName'); // This runs the function specified as second argument to `jest.mock`. moduleName(); // Will return '42';
Третій параметр можу бути використаний для створення віртуальних імітацій - таких, які не існують ніде в системі:
jest.mock('../moduleName', () => { /* * Custom implementation of a module that doesn't exist in JS, * like a generated module or a native module in react-native. */ }, {virtual: true});
Попередження: імпорт модуля в файл налаштування (вказаний в setupTestFrameworkScriptFile
) буде перешкоджати створення імітації для нього, як і для всіх модулів, які він імпортує.
Модулі, для яких створені імітації з допомогою jest.mock
є імітаціями тільки в межах файлу, в якому було викликано jest.mock
. Інший файл, який імпортує цей модуль, отримає оригінальну реалізацію навіть, якщо він буде виконаний після файлу, в якому створюється імітація.
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.unmock(moduleName)
#
Вказує системі модулів більше не повертати імітацію конкретного модуля з require()
(має повертатися оригінальна версія модуля).
Найпоширеніше використання цього API - вказання модуля, який даний тест повинен протестувати (а отже для цього модуля не повивнна бути створена імітація).
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.doMock(moduleName, factory, options)
#
Примітка: використовуючи babel-jest
, виклики mock
будуть автоматично спливати до початку блоку коду. Використовуйте цей метод якщо ви явно хочете уникати накої поведінки.
Це може бути корисно, коли ви хочете по-різному імітувати модуль в межах одного і того ж файла з тестами:
beforeEach(() => { jest.resetModules(); }); test('moduleName 1', () => { jest.doMock('../moduleName', () => { return jest.fn(() => 1); }); const moduleName = require('../moduleName'); expect(moduleName()).toEqual(1); }); test('moduleName 2', () => { jest.doMock('../moduleName', () => { return jest.fn(() => 2); }); const moduleName = require('../moduleName'); expect(moduleName()).toEqual(2); });
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.dontMock(moduleName)
#
Примітка: використовуючи babel-jest
, виклики unmock
будуть автоматично спливати до початку блоку коду. Використовуйте цей метод якщо ви явно хочете уникати накої поведінки.
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.clearAllMocks()
#
Очищує властивості mock.calls
і mock.instances
всії імітацій. Еквівалентно виклику .mockClear()
для кожної функції-імітації.
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.resetAllMocks()
#
Скидає стан всіх імітацій. Еквівалентно виклику .mockReset()
для кожної функції-імітації.
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.restoreAllMocks()
#
Доступно в Jest 20.1.0+ #
Скидає всі імітації до їх оригінальних значень. Еквівалентно виклику .mockRestore
для кожної імітованої функції. Майте на увазі, що jest.restoreAllMocks()
працює лише тоді, коли імітаії були створені з допомогою h jest.spyOn
; значення усіх інших імітацій потрібно буде відновлювати вручну.
jest.resetModules()
#
Скидає стан реєстру модулів - кешу всіх імпортованих модулів. Це корисно для ізоляції модулів, в яких локальний стан мжу конфліктувати між тестами.
Приклад:
const sum1 = require('../sum'); jest.resetModules(); const sum2 = require('../sum'); sum1 === sum2; // > false (sum1 і sum2 є різними екземплярами модуля "sum".)
Приклад в тесті:
beforeEach(() => { jest.resetModules(); }); test('works', () => { const sum = require('../sum'); }); test('works too', () => { const sum = require('../sum'); // змінна sum – це інша копія модуля "sum" у порівнянні з попереднім тестом. });
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.runAllTicks()
#
Виконує всі мікрозавдання в черзі (зазвичай створені в Node з допомогою process.nextTick
).
Коли викликається цей метод, всі мікрозавдання, заплановані через process.nextTick
будуть виконані. Додатково, якщо ці мікрозавдання самі планують нові мікрозавдання, вони теж будуть постійно виконуватися поки в черзі не залишиться жодного мікрозавдання.
jest.runAllTimers()
#
Виконує всі макрозавдання в черзі (заплановані, використовуючи setTimeout()
, setInterval()
та setImmediate()
).
Коли викилкається цей метод, всі макрозавданя, заплановані через setTimeout()
чи setInterval()
, будуть виконані. Додатково, якщо ці макроавдання самі планують нові макроавдання, вони теж будуть постійно виконуватися поки в черзі не залишиться жодного макроавдання.
Це часто буває корисно для синхронного виконання setTimeout’ів впродовж тесту для синхронної перевіки якоїсь поведінки, яка відбувається лише після виконання зворотніх викликів в setTimeout()
або setInterval()
. Перегляньте документацію по імітації таймерів для отримання додаткової інформації.
jest.runAllImmediates()
#
Виконує всі завдання, заплановані з використанням setImmediate()
.
jest.runTimersToTime(msToRun)
#
Виконує лише макрозавдання з черги (заплановані, використовуючи setTimeout()
, setInterval()
та setImmediate()
).
Коли викилкається цей метод, всі макрозавданя, заплановані з використанням setTimeout()
чи setInterval()
впродовж msToRun
мілісекунд, будуть виконані. Крім того якщо ці макрозавдання запланують нові, які мають виконатися в межах того ж часового проміжку, вони теж будуть виконані допоки в черзі не залишиться завдань, що мають бути виконані впродовж msToRun
мілісекунд.
jest.runOnlyPendingTimers()
#
Виконує лише ті макрозавдання, які в даний час заплановані (тобто лише завдання, які були поставлені в чергу за допомогою setTimeout()
чи setInterval()
до цього моменту). Якщо будь яке з запланованих макрозавдань запланує нове макрозавдання, ті нові завдання не будуть виконані цим викликом.
Це корисно для сценаріїв, коли модуль, що тестується, викликає setTimeout()
, зворотній виклик якого рекурсивно викликає інший setTimeout()
(що означає, що послідовність таймаутів ніколи не припинеться). У таких сценаріях корисно мати можливість рухатися вперед в часі на один крок за раз.
jest.setMock(moduleName, moduleExports)
#
Явно вказує об’єкт-імітацію, який має повернути система модулів для вказаного модуля.
Іноді бувають випадки, коли автоматично згенерована імітація, яку вам надає система модулів, недостатньо підходить для ваших тестових потреб. Зазвичай в таких випадках вам варто написати ручний мок, який найбільш підходить для запитаного модуля. Однак в екстремально рідкісних випадках навіть ручний мок не підходить для ваших цілей і вам потрібно створити імітацію всередині вашого тесту.
В таких рідкісних сценаріях ви можете використати цей API, щоб в ручну заповнити слот в реєстрі імітацій системи модулів.
Повертає об’єкт jest
для створення ланцюжків викликів.
Примітка. Рекомендується використовувати jest.mock()
замість цього метода. Другий аргумент jest.mock
- це функція, яка повертає імітацію замість очікуваного об’єкта модуля.
jest.setTimeout(timeout)
#
Встановлює таймаут за замовчуванням для тестів і before/after хуків в мілісекундах.
Примітка. За замовчуванням таймаут становить 5 секунд, якщо цей метод не був викликаний.
Приклад:
jest.setTimeout(1000); // 1 секунда
jest.useFakeTimers()
#
Вказує Jest використовувати імітовані версії стандартних функцій таймерів (setTimeout
, setInterval
, clearTimeout
, clearInterval
, nextTick
, setImmediate
та clearImmediate
).
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.useRealTimers()
#
Вказує Jest використовувати реальні версії стандартних функцій таймерів.
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.spyOn(object, methodName)
#
доступно в Jest 19.0.0+ #
Створює імітацію функції, як і jest.fn
, але також відслідковує виклики object[methodName]
. Повертає функцію-імітацію Jest.
Примітка: За замовчуванням, jest.spyOn
також викликає метод за яким спостерігає. Це відміна поведінка у порівнянні з більшістю інших тестових бібліотек. Якщо ви очете переписати оригінальну функцію, ви можете використати jest.spyOn(object, methodName).mockImplementation(() => customImplementation)
або object[methodName] = jest.fn(() => customImplementation);
Приклад:
const video = { play() { return true; }, }; module.exports = video;
Приклад тесту:
const video = require('./video'); test('plays video', () => { const spy = jest.spyOn(video, 'play'); const isPlaying = video.play(); expect(spy).toHaveBeenCalled(); expect(isPlaying).toBe(true); spy.mockReset(); spy.mockRestore(); });