The Jest Object
Об’єкт 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)
#
When using babel-jest
, calls to mock
will automatically be hoisted to the top of the code block. Use this method if you want to explicitly avoid this behavior.
One example when this is useful is when you want to mock a module differently within the same file:
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)
#
When using babel-jest
, calls to unmock
will automatically be hoisted to the top of the code block. Use this method if you want to explicitly avoid this behavior.
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.clearAllMocks()
#
Очищує властивості mock.calls
і mock.instances
всії імітацій. Еквівалентно виклику .mockClear()
для кожної функції-імітації.
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.resetAllMocks()
#
Скидає стан всіх імітацій. Еквівалентно виклику .mockReset()
для кожної функції-імітації.
Повертає об’єкт jest
для створення ланцюжків викликів.
jest.restoreAllMocks()
#
available in Jest 20.1.0+ #
Restores all mocks back to their original value. Equivalent to calling .mockRestore
on every mocked function. Beware that jest.restoreAllMocks()
only works when mock was created with jest.spyOn
; other mocks will require you to manually restore them.
jest.resetModules()
#
Скидає стан реєстру модулів - кешу всіх імпортованих модулів. Це корисно для ізоляції модулів, в яких локальний стан мжу конфліктувати між тестами.
Приклад:
const sum1 = require('../sum'); jest.resetModules(); const sum2 = require('../sum'); sum1 === sum2; // > false (Both sum modules are separate "instances" of the sum module.)
Приклад в тесті:
beforeEach(() => { jest.resetModules(); }); test('works', () => { const sum = require('../sum'); }); test('works too', () => { const sum = require('../sum'); // sum is a different copy of the sum module from the previous test. });
Повертає об’єкт 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(); });