Добавление глобальных функций в Jest
Чтобы добавить глобальные функции в jest, вам необходимо определить setupFiles
в вашей конфигурации и присоединить эту функцию к глобальному объекту в файле установки:
module.exports = {
// ...
setupFiles: ['<rootDir>/setupFile.js'],
// ...
};
поэтому, если вы хотите сделать что-то очень похожее на it
, я бы посоветовал вам сделать что-то вроде этого:
// /setupFile.js
// in order to change an existing function (not youre case):
global.it = function(description, fn) { /* ... */ };
// this is how you define a new function globally
global.assertTruthy = (message, func, ...args) => {
return global.it(message, () => {
expect(func(...args)).toBeTruthy();
});
// optional: implementing the same interface as `jest.It`
Поддержка того же интерфейса, что и jest.It
Вот пример из библиотеки Airbnb airbnb/jest-wrap
, где они обернули функцию описания. Если вы хотите реализовать интерфейс jest.It
, вам также необходимо реализовать assertTruthy.todo
, assertTruthy.skip
, assertTruthy.only
, & assertTruthy.each
( проверить интерфейс it
). todo
и skip
довольно просты, так как вы хотите сделать то же самое, что и исходные.
Для each
& only
нам нужно изменить функцию it
внутри нашей реализации. Простой способ поддержки only
заключается в использовании замыкания и передаче правильной функции it
из ввода замыкания. each
может быть немного сложнее в реализации.
// /setupFile.js
// normaly, use the jest `it` function
global.assertTruthy = assertTruthyCreator(it);
// bypass for todo and skip
global.assertTruthy.todo = global.it.todo;
global.assertTruthy.skip = global.it.skip;
// only calls the same function but uses `only` internaly
global.assertTruthy.only = assertTruthyCreator(it.only);
// special case which needs special implementation
// see usage below
global.assertTruthy.each = assertTruthyCreator(it.each, true);
function assertTruthyCreator(itFunc, withTable) {
if (withTable) {
return (message, func, ...args) => {
return itFunc(args)(message, (...caseArgs) => {
expect(func(...caseArgs)).toBeTruthy();
});
};
}
return (message, func, ...args) => {
return itFunc(message, () => {
expect(func(...args)).toBeTruthy();
});
};
}
// usage:
assertTruthy.each(
'add numbers',
(a, b) => a + b,
[2, 4],
[4, 5],
[7, 9]);
Как использовать в тестовых файлах
Если вы используете машинописный текст для написания jest-теста, первое, что вам нужно сделать, это declare
ваша новая функция где-то:
interface IGenericFunction {
(...args: any[]): any;
}
declare const assertTruthy: (message: string, func: IGenericFunction, ...args: any[]) => any;
С помощью javascript вы можете пропустить этот шаг.
После этого просто используйте его как describe
и it
:
const funcToTest = (a: number, b: number) => a + b;
describe("Test Suite", () => {
assertTruthy('this ran with assertTruthy', funcToTest, 5, 3);
test("another test", () => {
// ...
});
});
и jest будет рассматривать это как любую другую it
функцию
![jest run results](https://i.stack.imgur.com/UWUSy.png)
Использование в качестве node_module
зависимости
Если вы хотите создать библиотеку из этого, вы можете просто передать путь node_modules
в массив setupFiles
.
Например, с этим хранилищем вы можете сделать следующее:
- Установка с использованием
npm install --save-dev @kibibit/jest-utils
- Добавьте следующее к вашей конфигурации шутки
- Используйте функцию, как описано выше
module.exports = {
// ...
setupFiles: ['node_modules/@kibibit/jest-utils/lib/jest-utils.js'],
// ...
};
и он должен работать так же, как импортировать его локально.