Перейти к основной части
Version: Далее

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

Jest использует «cопоставления» для тестирования значений разными способами. На этой странице будут представлены сопоставления, которые чаще всего используются. Полный список смотрите в описании expect API.

Стандартные сопоставления

Самый простой способ проверить значение — при помощи точного равенства.

test('два плюс два равно четыре', () => {
expect(2 + 2).toBe(4);
});

В этом коде expect(2+2) возвращает объект "ожиданий". Обычно вам не придется делать с этими объектами ожиданий ничего кроме как вызывать их вычислители. В этом примере кода .toBe(4) это вычислитель. При запуске, Jest отслеживает все провалившиеся вычислители для того, чтобы он мог напечатать для вас сообщения об ошибках.

toBe использует Object.is для проверки точного совпадения. If you want to check the value of an object, use toEqual:

test('присваивание объекту', () => {
const data = {один: 1};
data['два'] = 2;
expect(data).toEqual({один: 1, два: 2});
});

toEqual рекурсивно проверяет каждое поле объекта или массива.

tip

toEqual ignores object keys with undefined properties, undefined array items, array sparseness, or object type mismatch. To take these into account use toStrictEqual instead.

You can also test for the opposite of a matcher using not:

test('сложение положительных чисел не равно нулю', () => {
for (let a = 1; a < 10; a++) {
for (let b = 1; b < 10; b++) {
expect(a + b).not.toBe(0);
}
}
});

Правдивость

При тестировании иногда необходимо различать undefined, null и false, но в некоторых ситуациях это не требуется. Jest содержит вспомогательные функции позволяющие явно указывать, что вам нужно.

  • toBeNull соответствует только null
  • toBeUndefined соответствует только undefined
  • toBeDefined является противоположностью toBeUndefined
  • toBeTruthy соответствует всему, что if инструкция рассматривает как true
  • toBeFalsy соответствует всему, что if инструкция рассматривает как false

Например:

test('null', () => {
const n = null;
expect(n).toBeNull();
expect(n).toBeDefined();
expect(n).not.toBeUndefined();
expect(n).not.toBeTruthy();
expect(n).toBeFalsy();
});

test('ноль', () => {
const z = 0;
expect(z).not.toBeNull();
expect(z).toBeDefined();
expect(z).not.toBeUndefined();
expect(z).not.toBeTruthy();
expect(z).toBeFalsy();
});

Следует использовать вычислитель, который наиболее точно отражает то, что код должен делать.

Числа

Большинство способов сравнения чисел имеют эквивалентные вычислители.

test('два плюс два', () => {
const value = 2 + 2;
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3.5);
expect(value).toBeLessThan(5);
expect(value).toBeLessThanOrEqual(4.5);

// toBe и toEqual эквивалентны по отношению к числам
expect(value).toBe(4);
expect(value).toEqual(4);
});

Для проверки равенства чисел с плавающей запятой, используйте toBeCloseTo вместо toEqual потому, что вы не хотите, чтобы тест полагался на небольшую ошибку округления.

test('сложение чисел с плавающей запятой', () => {
const value = 0.1 + 0.2;
//expect(value).toBe(0.3); Это не будет работать из-за ошибки округления
expect(value).toBeCloseTo(0.3); // А это сработает.
});

Строки

Для сопоставления строк с регулярными выражениями, используйте toMatch:

test('в команде нет места Я', () => {
expect('команда').not.toMatch(/Я/);
});

test('но есть "ася" в Васе', () => {
expect('Вася').toMatch(/ася/);
});

Массивы и перебираемые объекты

Вы можете проверить, содержит ли массив или итерируемый объект конкретное значение, используя toContain:

const shoppingList = [
'diapers',
'kleenex',
'trash bags',
'paper towels',
'milk',
];

test('the shopping list has milk on it', () => {
expect(shoppingList).toContain('milk');
expect(new Set(shoppingList)).toContain('milk');
});

Исключения

Для проверки возврата ошибки конкретной функцией при её вызове, используйте toThrow.

function compileAndroidCode() {
throw new Error('you are using the wrong JDK!');
}

test('compiling android goes as expected', () => {
expect(() => compileAndroidCode()).toThrow();
expect(() => compileAndroidCode()).toThrow(Error);

// You can also use a string that must be contained in the error message or a regexp
expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
expect(() => compileAndroidCode()).toThrow(/JDK/);

// Or you can match an exact error message using a regexp like below
expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK$/); // Test fails
expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK!$/); // Test pass
});
tip

The function that throws an exception needs to be invoked within a wrapping function otherwise the toThrow assertion will fail.

И многое другое

Это лишь проба пера. Для ознакомления с полным списком сопоставлений, обратите внимание на справочную документацию.

После того как вы узнали о всех доступных сопоставлениях, следующим шагом взгляните на то, как Jest позволяет тестировать асинхронный код.