Spec-Zone.ru › Jest

Глобальные переменные

В ваших тестовых файлах Jest помещает каждый из этих методов и объектов в глобальную среду. Вам не нужно ничего подключать или импортировать, чтобы их использовать. Однако, если вы предпочитаете явные импорты, вы можете сделать import {describe, expect, test} from '@jest/globals'.

Методы

  • Справочная информация
    • 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
    • .each

Справочная информация

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, он выполняется в конце блока 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(() => {
  // Clears the database and adds some testing data.
  // Jest will wait for this promise to resolve before running tests.
  return globalDatabase.clear().then(() => {
    return globalDatabase.insert({testData: 'foo'});
  });
});

// Since we only set up the database once in this example, it's important
// that our tests don't modify it.
test('can find things', () => {
  return globalDatabase.find('thing', {}, results => {
    expect(results.length).toBeGreaterThan(0);
  });
});

Здесь beforeAll гарантирует, что база данных настраивается перед запуском тестов. Если настройка была синхронной, вы могли бы сделать это без beforeAll. Ключевым моментом является то, что Jest будет ожидать разрешения промиса, поэтому у вас может быть и асинхронная настройка.

Если beforeAll находится внутри блока describe, он выполняется в начале блока describe.

Если вы хотите выполнить что-то перед каждым тестом, а не перед запуском всех тестов, используйте beforeEach вместо этого.

beforeEach(fn, timeout)

Выполняет функцию перед запуском каждого из тестов в этом файле. Если функция возвращает промис или является генератором, Jest ожидает, пока этот промис не будет разрешен, прежде чем запустить тест.

Необязательно, вы можете указать timeout (в миллисекундах), чтобы указать, сколько времени ожидать, прежде чем прервать выполнение. Примечание: Значение по умолчанию для таймаута — 5 секунд.

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

Например:

const globalDatabase = makeGlobalDatabase();

beforeEach(() => {
  // Clears the database and adds some testing data.
  // Jest will wait for this promise to resolve before running tests.
  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, который должен быть вкусным, но не кислым, вы можете протестировать его так:

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')).toThrowError(CustomError);
    });

    test('with extra whitespace throws CustomError', () => {
      expect(() => binaryStringToNumber('  100')).toThrowError(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 для каждой строки.
    • Примечание Если вы передаёте одномерный массив примитивов, то он будет преобразован во внутреннюю таблицу, например, [1, 2, 3] -> [[1], [2], [3]]
  • name: String заголовок набора тестов.
    • Создавайте уникальные заголовки тестов, позиционно вставляя параметры с помощью printf форматирования:
      • %p - pretty-format.
      • %s - Строка.
      • %d - Число.
      • %i - Целое число.
      • %f - Вещественное число с плавающей точкой.
      • %j - JSON.
      • %o - Объект.
      • %# - Индекс тестового случая.
      • %% - одиночный символ процента ('%'). Это не потребляет аргумент.
    • Или генерируйте уникальные заголовки тестов, вставляя свойства объекта тестового случая с $variable:
      • Чтобы вставить значения вложенных объектов, можно указать ключевой путь, например, $variable.path.to.value
      • Можно использовать $# для вставки индекса тестового случая.
      • Вы не можете использовать $variable с printf форматированием, за исключением %%
  • fn: Function набор тестов для выполнения, это функция, которая получит параметры в каждой строке в качестве аргументов функции.
  • Необязательно, вы можете указать timeout (в миллисекундах), чтобы указать, сколько времени ожидать для каждой строки, прежде чем прервать выполнение. Примечание: Значение по умолчанию для таймаута — 5 секунд.

Пример:

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);
  });
});

2. describe.each`table`(name, fn, timeout)

  • table: Tagged Template Literal
    • Первая строка заголовков столбцов имени переменной, разделённых |
    • Одна или несколько последующих строк данных, предоставленных как выражения шаблона строки, используя ${value} синтаксис.
  • name: String заголовок набора тестов, используйте $variable для вставки тестовых данных в заголовок набора тестов из выражений шаблона строки и $# для индекса строки.
    • Чтобы вставить значения вложенных объектов, можно указать ключевой путь, например, $variable.path.to.value
  • fn: Function набор тестов для выполнения, это функция, которая получит объект с тестовыми данными.
  • Необязательно, вы можете указать timeout (в миллисекундах), чтобы указать, сколько времени ожидать для каждой строки, прежде чем прервать выполнение. Примечание: Значение по умолчанию для таймаута — 5 секунд.

Пример:

describe.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('$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);
  });
});

describe.only(name, fn)

Также под псевдонимом: fdescribe(name, fn)

Вы можете использовать describe.only , если хотите запустить только один блок describe:

describe.only('my beverage', () => {
  test('is delicious', () => {
    expect(myBeverage.delicious).toBeTruthy();
  });

  test('is not sour', () => {
    expect(myBeverage.sour).toBeFalsy();
  });
});

describe('my other beverage', () => {
  // ... will be skipped
});

describe.only.each(table)(name, fn)

Также под псевдонимами: fdescribe.each(table)(name, fn) и fdescribe.each`table`(name, fn)

Используйте describe.only.each , если хотите запустить только определённые наборы тестов для тестов с данными.

describe.only.each доступен с двумя API:

describe.only.each(table)(name, fn)

describe.only.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('will not be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

describe.only.each`table`(name, fn)

describe.only.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('returns $expected when $a is added $b', ({a, b, expected}) => {
  test('passes', () => {
    expect(a + b).toBe(expected);
  });
});

test('will not be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

describe.skip(name, fn)

Также под псевдонимом: xdescribe(name, fn)

Вы можете использовать describe.skip , если не хотите запускать тесты в определённом блоке describe:

describe('my beverage', () => {
  test('is delicious', () => {
    expect(myBeverage.delicious).toBeTruthy();
  });

  test('is not sour', () => {
    expect(myBeverage.sour).toBeFalsy();
  });
});

describe.skip('my other beverage', () => {
  // ... will be skipped
});

Использование describe.skip часто является более чистым вариантом, чем временное комментирование части тестов. Обратите внимание, что блок describe всё равно будет выполнен. Если вам также нужно пропустить какую-либо настройку, сделайте это в блоке beforeAll или beforeEach.

describe.skip.each(table)(name, fn)

Также под псевдонимами: xdescribe.each(table)(name, fn) и xdescribe.each`table`(name, fn)

Используйте describe.skip.each, если хотите остановить выполнение набора тестов, основанных на данных.

describe.skip.each доступен с двумя API:

describe.skip.each(table)(name, fn)

describe.skip.each([
  [1, 1, 2],
  [1, 2, 3],
  [2, 1, 3],
])('.add(%i, %i)', (a, b, expected) => {
  test(`returns ${expected}`, () => {
    expect(a + b).toBe(expected); // will not be ran
  });
});

test('will be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

describe.skip.each`table`(name, fn)

describe.skip.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('returns $expected when $a is added $b', ({a, b, expected}) => {
  test('will not be ran', () => {
    expect(a + b).toBe(expected); // will not be ran
  });
});

test('will be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test(name, fn, timeout)

Также доступен под псевдонимом: it(name, fn, timeout)

Всё, что вам нужно в файле с тестами, это метод test, который выполняет тест. Например, предположим, что есть функция inchesOfRain(), которая должна возвращать ноль. Ваш весь тест может выглядеть так:

test('did not rain', () => {
  expect(inchesOfRain()).toBe(0);
});

Первый аргумент — имя теста; второй — функция, содержащая ожидания для проверки. Третий аргумент (необязательный) — timeout (в миллисекундах) для указания времени ожидания перед прерыванием. Примечание: значение по умолчанию для таймаута — 5 секунд.

Примечание: Если из test возвращается обещание, Jest будет ждать разрешения обещания перед завершением теста. Jest также будет ждать, если вы передадите аргумент в функцию теста, обычно называемую done. Это может быть полезно, когда вы хотите тестировать обратные вызовы. Как тестировать асинхронный код — см. здесь.

Например, предположим, что fetchBeverageList() возвращает обещание, которое должно разрешиться в список, содержащий lemon. Вы можете протестировать это следующим образом:

test('has lemon in it', () => {
  return fetchBeverageList().then(list => {
    expect(list).toContain('lemon');
  });
});

Несмотря на то, что вызов test вернётся сразу, тест не завершится до тех пор, пока обещание также не разрешится.

test.concurrent(name, fn, timeout)

Также доступен под псевдонимом: it.concurrent(name, fn, timeout)

Используйте test.concurrent, если хотите, чтобы тест выполнялся параллельно.

Примечание: test.concurrent считается экспериментальным — см. здесь для получения подробной информации о недостающих функциях и других проблемах

Первый аргумент — имя теста; второй — асинхронная функция, содержащая ожидания для проверки. Третий аргумент (необязательный) — timeout (в миллисекундах) для указания времени ожидания перед прерыванием. Примечание: значение по умолчанию для таймаута — 5 секунд.

test.concurrent('addition of 2 numbers', async () => {
  expect(5 + 3).toBe(8);
});

test.concurrent('subtraction 2 numbers', async () => {
  expect(5 - 3).toBe(2);
});

Примечание: Используйте maxConcurrency в конфигурации, чтобы предотвратить выполнение Jest более чем указанного количества тестов одновременно.

test.concurrent.each(table)(name, fn, timeout)

Также доступен под псевдонимом: it.concurrent.each(table)(name, fn, timeout)

Используйте test.concurrent.each, если вы постоянно дублируете тот же тест с различными данными. test.each позволяет вам написать тест один раз и передать данные, тесты выполняются асинхронно.

test.concurrent.each доступен с двумя API:

1. test.concurrent.each(table)(name, fn, timeout)

  • table: Array массивов с аргументами, передаваемыми в тест fn для каждой строки.
    • Примечание Если вы передаёте одномерный массив примитивов, внутренне он будет сопоставлен со строкой таблицы, т.е. [1, 2, 3] -> [[1], [2], [3]]
  • name: String заголовок блока теста.
    • Создайте уникальные заголовки тестов, подставляя параметры позиционно с помощью printf форматирования:
      • %p - pretty-format.
      • %s - Строка.
      • %d - Число.
      • %i - Целое число.
      • %f - Вещественное значение.
      • %j - JSON.
      • %o - Объект.
      • %# - Индекс тестового случая.
      • %% - одиночный знак процента ('%'). Это не потребляет аргумент.
  • fn: Function тест для выполнения, это функция, которая получит параметры в каждой строке в качестве аргументов функции, это должна быть асинхронная функция.
  • Необязательно, вы можете указать timeout (в миллисекундах) для указания времени ожидания для каждой строки перед прерыванием. Примечание: значение по умолчанию для таймаута — 5 секунд.

Пример:

test.concurrent.each([
  [1, 1, 2],
  [1, 2, 3],
  [2, 1, 3],
])('.add(%i, %i)', async (a, b, expected) => {
  expect(a + b).toBe(expected);
});

2. test.concurrent.each`table`(name, fn, timeout)

  • table: Tagged Template Literal
    • Первая строка заголовков столбцов имени переменных, разделенных |
    • Одна или несколько последующих строк данных, предоставленных как выражения шаблонов строк с использованием синтаксиса ${value}.
  • name: String заголовок теста, используйте $variable для вставки тестовых данных в заголовок теста из выражений помеченных шаблонов.
    • Для вставки значений вложенных объектов вы можете указать путь к ключу, т.е. $variable.path.to.value
  • fn: Function тест для выполнения, это функция, которая получит объект тестовых данных, это должна быть асинхронная функция.
  • Необязательно, вы можете указать timeout (в миллисекундах) для указания времени ожидания для каждой строки перед прерыванием. Примечание: значение по умолчанию для таймаута — 5 секунд.

Пример:

test.concurrent.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('returns $expected when $a is added $b', async ({a, b, expected}) => {
  expect(a + b).toBe(expected);
});

test.concurrent.only.each(table)(name, fn)

Также доступен под псевдонимом: it.concurrent.only.each(table)(name, fn)

Используйте test.concurrent.only.each, если хотите выполнять только определенные тесты с разными тестовыми данными параллельно.

test.concurrent.only.each доступен с двумя API:

test.concurrent.only.each(table)(name, fn)

test.concurrent.only.each([
  [1, 1, 2],
  [1, 2, 3],
  [2, 1, 3],
])('.add(%i, %i)', async (a, b, expected) => {
  expect(a + b).toBe(expected);
});

test('will not be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test.only.each`table`(name, fn)

test.concurrent.only.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('returns $expected when $a is added $b', async ({a, b, expected}) => {
  expect(a + b).toBe(expected);
});

test('will not be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test.concurrent.skip.each(table)(name, fn)

Также доступен под псевдонимом: it.concurrent.skip.each(table)(name, fn)

Используйте test.concurrent.skip.each, если хотите остановить выполнение набора асинхронных тестов, основанных на данных.

test.concurrent.skip.each доступен с двумя API:

test.concurrent.skip.each(table)(name, fn)

test.concurrent.skip.each([
  [1, 1, 2],
  [1, 2, 3],
  [2, 1, 3],
])('.add(%i, %i)', async (a, b, expected) => {
  expect(a + b).toBe(expected); // will not be ran
});

test('will be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test.concurrent.skip.each`table`(name, fn)

test.concurrent.skip.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('returns $expected when $a is added $b', async ({a, b, expected}) => {
  expect(a + b).toBe(expected); // will not be ran
});

test('will be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test.each(table)(name, fn, timeout)

Также доступен под псевдонимами: it.each(table)(name, fn) и it.each`table`(name, fn)

Используйте test.each, если вы постоянно дублируете тот же тест с различными данными. test.each позволяет вам написать тест один раз и передать данные.

test.each доступен с двумя API:

1. test.each(table)(name, fn, timeout)

  • table: Array массивов с аргументами, передаваемыми в тест fn для каждой строки.
    • Примечание Если вы передаёте одномерный массив примитивов, внутренне он будет сопоставлен со строкой таблицы, т.е. [1, 2, 3] -> [[1], [2], [3]]
  • name: String заголовок блока теста.
    • Создайте уникальные заголовки тестов, подставляя параметры позиционно с помощью printf форматирования:
      • %p - pretty-format.
      • %s - Строка.
      • %d - Число.
      • %i - Целое число.
      • %f - Вещественное значение.
      • %j - JSON.
      • %o - Объект.
      • %# - Индекс тестового случая.
      • %% - одиночный знак процента ('%'). Это не потребляет аргумент.
    • Или генерируйте уникальные заголовки тестов, подставляя свойства объекта тестового случая с помощью $variable.
      • Для вставки значений вложенных объектов можно указать путь к ключу, т.е. $variable.path.to.value
      • Можно использовать $# для вставки индекса тестового случая
      • Нельзя использовать $variable с printf форматированием, за исключением %%
  • fn: Function тест для выполнения, это функция, которая получит параметры в каждой строке в качестве аргументов функции.
  • Необязательно, вы можете указать timeout (в миллисекундах) для указания времени ожидания для каждой строки перед прерыванием. Примечание: значение по умолчанию для таймаута — 5 секунд.

Пример:

test.each([
  [1, 1, 2],
  [1, 2, 3],
  [2, 1, 3],
])('.add(%i, %i)', (a, b, expected) => {
  expect(a + b).toBe(expected);
});
test.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}) => {
  expect(a + b).toBe(expected);
});

2. test.each`table`(name, fn, timeout)

  • table: Tagged Template Literal
    • Первая строка заголовков столбцов имени переменных, разделенных |
    • Одна или несколько последующих строк данных, предоставленных как выражения шаблонов строк с использованием синтаксиса ${value}.
  • name: String заголовок теста, используйте $variable для вставки тестовых данных в заголовок теста из выражений помеченных шаблонов.
    • Для вставки значений вложенных объектов вы можете указать путь к ключу, т.е. $variable.path.to.value
  • fn: Function тест для выполнения, это функция, которая получит объект тестовых данных.
  • Необязательно, вы можете указать timeout (в миллисекундах) для указания времени ожидания для каждой строки перед прерыванием. Примечание: значение по умолчанию для таймаута — 5 секунд.

Пример:

test.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('returns $expected when $a is added $b', ({a, b, expected}) => {
  expect(a + b).toBe(expected);
});

test.failing(name, fn, timeout)

Также доступен под псевдонимом: it.failing(name, fn, timeout)

примечание

Это доступно только с предустановленным исполнителем jest-circus.

Используйте test.failing, когда вы пишете тест и ожидаете, что он завершится неудачей. Эти тесты будут вести себя иначе, чем обычные тесты. Если тест failing выбросит ошибки, то он пройдёт. Если нет, то он завершится неудачей.

tip

Вы можете использовать этот тип тестов, например, при написании кода в стиле BDD. В этом случае тесты не будут отображаться как не пройденные, пока не пройдут. Затем вы можете просто удалить модификатор failing, чтобы они прошли.

Это также может быть отличным способом внести не проходящие тесты в проект, даже если вы не знаете, как исправить ошибку.

Пример:

test.failing('it is not equal', () => {
  expect(5).toBe(6); // this test will pass
});

test.failing('it is equal', () => {
  expect(10).toBe(10); // this test will fail
});

test.failing.each(name, fn, timeout)

Также под псевдонимами: it.failing.each(table)(name, fn) и it.failing.each`table`(name, fn)

note

Это доступно только с предустановленным исполнителем jest-circus.

Вы также можете запускать несколько тестов одновременно, добавив each после failing.

Пример:

test.failing.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}) => {
  expect(a + b).toBe(expected);
});

test.only.failing(name, fn, timeout)

Также под псевдонимами: it.only.failing(name, fn, timeout), fit.failing(name, fn, timeout)

note

Это доступно только с предустановленным исполнителем jest-circus.

Используйте test.only.failing, если хотите запустить только определенный не прошедший тест.

test.skip.failing(name, fn, timeout)

Также под псевдонимами: it.skip.failing(name, fn, timeout), xit.failing(name, fn, timeout), xtest.failing(name, fn, timeout)

note

Это доступно только с предустановленным исполнителем jest-circus.

Используйте test.skip.failing, если хотите пропустить запуск определенного не прошедшего теста.

test.only(name, fn, timeout)

Также под псевдонимами: it.only(name, fn, timeout), и fit(name, fn, timeout)

При отладке большого файла тестов часто требуется запустить только подмножество тестов. Вы можете использовать .only для указания тестов, которые нужно запустить в этом файле.

Необязательно, вы можете указать timeout (в миллисекундах) для указания времени ожидания до прерывания. Примечание: значение по умолчанию для таймаута — 5 секунд.

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

test.only('it is raining', () => {
  expect(inchesOfRain()).toBeGreaterThan(0);
});

test('it is not snowing', () => {
  expect(inchesOfSnow()).toBe(0);
});

В этом файле запустится только тест "it is raining", так как он запущен с помощью test.only.

Обычно вы не должны включать код, использующий test.only, в систему управления версиями — используйте его для отладки и удалите, как только исправите сломанные тесты.

test.only.each(table)(name, fn)

Также под псевдонимами: it.only.each(table)(name, fn), fit.each(table)(name, fn), it.only.each`table`(name, fn) и fit.each`table`(name, fn)

Используйте test.only.each для запуска только определённых тестов с разными тестовыми данными.

test.only.each доступен с двумя API:

test.only.each(table)(name, fn)

test.only.each([
  [1, 1, 2],
  [1, 2, 3],
  [2, 1, 3],
])('.add(%i, %i)', (a, b, expected) => {
  expect(a + b).toBe(expected);
});

test('will not be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test.only.each`table`(name, fn)

test.only.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('returns $expected when $a is added $b', ({a, b, expected}) => {
  expect(a + b).toBe(expected);
});

test('will not be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test.skip(name, fn)

Также под псевдонимами: it.skip(name, fn), xit(name, fn), и xtest(name, fn)

При работе с большой кодовой базой иногда вы можете встретить тест, который временно сломан по какой-то причине. Если вы хотите пропустить запуск этого теста, но не хотите удалять этот код, вы можете использовать test.skip для указания некоторых тестов для пропуска.

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

test('it is raining', () => {
  expect(inchesOfRain()).toBeGreaterThan(0);
});

test.skip('it is not snowing', () => {
  expect(inchesOfSnow()).toBe(0);
});

Запустится только тест "it is raining", так как другой тест запущен с test.skip.

Вы могли бы закомментировать тест, но использование test.skip часто оказывается удобнее, так как оно сохранит отступы и подсветку синтаксиса.

test.skip.each(table)(name, fn)

Также под псевдонимами: it.skip.each(table)(name, fn), xit.each(table)(name, fn), xtest.each(table)(name, fn), it.skip.each`table`(name, fn), xit.each`table`(name, fn) и xtest.each`table`(name, fn)

Используйте test.skip.each для остановки запуска набора тестов с данными.

test.skip.each доступен с двумя API:

test.skip.each(table)(name, fn)

test.skip.each([
  [1, 1, 2],
  [1, 2, 3],
  [2, 1, 3],
])('.add(%i, %i)', (a, b, expected) => {
  expect(a + b).toBe(expected); // will not be ran
});

test('will be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test.skip.each`table`(name, fn)

test.skip.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('returns $expected when $a is added $b', ({a, b, expected}) => {
  expect(a + b).toBe(expected); // will not be ran
});

test('will be ran', () => {
  expect(1 / 0).toBe(Infinity);
});

test.todo(name)

Также под псевдонимом: it.todo(name)

Используйте test.todo при планировании написания тестов. Эти тесты будут выделены в сводке вывода в конце, чтобы вы знали, сколько тестов ещё нужно написать.

Примечание: Если вы предоставите функцию обратного вызова для теста, то test.todo выбросит ошибку. Если вы уже реализовали тест, и он сломан, и вы не хотите, чтобы он запускался, используйте test.skip вместо этого.

API

  • name: String название плана тестирования.

Пример:

const add = (a, b) => a + b;

test.todo('add should be associative');

Использование TypeScript

info

Эти советы и замечания по использованию TypeScript применимы только в том случае, если вы импортируете из '@jest/globals'.

import {describe, test} from '@jest/globals';

.each

Модификатор .each предоставляет несколько способов определения таблицы тестовых случаев. Некоторые API имеют замечания, связанные с выводом типов аргументов, передаваемых в функции обратного вызова describe или test. Давайте рассмотрим каждый из них.

note

Для простоты в примерах выбран test.each, но вывод типов одинаков во всех случаях, где можно использовать модификатор .each: describe.each, test.concurrent.only.each, test.skip.each, и т.д.

Массив объектов

API массива объектов наиболее подробен, но делает вывод типов без проблем. table может быть встроен:

test.each([
  {name: 'a', path: 'path/to/a', count: 1, write: true},
  {name: 'b', path: 'path/to/b', count: 3},
])('inline table', ({name, path, count, write}) => {
  // arguments are typed as expected, e.g. `write: boolean | undefined`
});

Или объявлен как отдельная переменная:

const table = [
  {a: 1, b: 2, expected: 'three', extra: true},
  {a: 3, b: 4, expected: 'seven', extra: false},
  {a: 5, b: 6, expected: 'eleven'},
];

test.each(table)('table as a variable', ({a, b, expected, extra}) => {
  // again everything is typed as expected, e.g. `extra: boolean | undefined`
});

Массив массивов

Стиль массива массивов будет работать без проблем с встроенными таблицами:

test.each([
  [1, 2, 'three', true],
  [3, 4, 'seven', false],
  [5, 6, 'eleven'],
])('inline table example', (a, b, expected, extra) => {
  // arguments are typed as expected, e.g. `extra: boolean | undefined`
});

Однако, если таблица объявлена как отдельная переменная, она должна быть типизирована как массив кортежей для корректного вывода типов (это не требуется, только если все элементы строки одного типа):

const table: Array<[number, number, string, boolean?]> = [
  [1, 2, 'three', true],
  [3, 4, 'seven', false],
  [5, 6, 'eleven'],
];

test.each(table)('table as a variable example', (a, b, expected, extra) => {
  // without the annotation types are incorrect, e.g. `a: number | string | boolean`
});

Шаблонные литералы

Если все значения одного типа, API шаблонных литералов будет корректно выводить типы аргументов:

test.each`
  a    | b    | expected
  ${1} | ${2} | ${3}
  ${3} | ${4} | ${7}
  ${5} | ${6} | ${11}
`('template literal example', ({a, b, expected}) => {
  // all arguments are of type `number`
});

В противном случае потребуется общий тип аргумента:

test.each<{a: number; b: number; expected: string; extra?: boolean}>`
  a    | b    | expected    | extra
  ${1} | ${2} | ${'three'}  | ${true}
  ${3} | ${4} | ${'seven'}  | ${false}
  ${5} | ${6} | ${'eleven'}
`('template literal example', ({a, b, expected, extra}) => {
  // without the generic argument in this case types would default to `unknown`
});

© 2022 Facebook, Inc.
Licensed under the MIT License.
https://jestjs.io/docs/api

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API