Как добавить глобальные команды в Jest, как описать и это? - PullRequest
5 голосов
/ 16 мая 2019

Я пишу небольшой инструмент для тестирования Jest (только для изучения).Он называется assertTruthy(msg, fn, args), ожидает сообщение, функцию и аргументы и должен пройти, если то, что возвращается, когда функция вызывается с аргументами, является правдивым и завершается ошибкой, если его нет.

Я хотел быдобавьте его в Jest, чтобы вы могли вызывать его, не импортируя его в каждую среду.

describe('someFn()', () => {
  // like 'it', 'describe' and 'expect' it should just be available here
  it('is a function', () => {
    expect(typeop someFN).toEqual('Function');
  });

  assertTruthy('it should return true', someFn, 3, 4);
});

Я знаю, что Jest имеет setupFiles и setupFilesAfterEnv, но я не могу понятьКак использовать их для достижения этой цели.

Как добавить команды в Jest?

PS: Для одного проекта ( в CRA ) Мне удалось сделать это так:

// in src/setupFiles.js
const assertTruthy = // function definition ...
global.assertTruthy = assertTruthy

1 Ответ

4 голосов
/ 20 мая 2019

Добавление глобальных функций в 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

Использование в качестве node_module зависимости

Если вы хотите создать библиотеку из этого, вы можете просто передать путь node_modules в массив setupFiles.

Например, с этим хранилищем вы можете сделать следующее:

  1. Установка с использованием npm install --save-dev @kibibit/jest-utils
  2. Добавьте следующее к вашей конфигурации шутки
  3. Используйте функцию, как описано выше
module.exports = {
  // ...
  setupFiles: ['node_modules/@kibibit/jest-utils/lib/jest-utils.js'],
  // ...
};

и он должен работать так же, как импортировать его локально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...