Использование матчеров
Jest использует «матчеры», чтобы проверять значения разными способами. В этом документе представлены некоторые часто используемые матчеры. Полный список см. в expect документации API.
Распространённые матчеры
Самый простой способ проверить значение — сравнить его на точное равенство.
test('two plus two is four', () => {
expect(2 + 2).toBe(4);
});
В этом коде expect(2 + 2) возвращает объект «ожидания». Обычно вы не делаете с такими объектами ничего, кроме вызова матчера для проверки. В этом коде .toBe(4) — это матчер. При запуске Jest отслеживает все проверки, завершившиеся ошибкой, чтобы вывести для вас понятные сообщения об ошибках.
toBe использует Object.is для проверки точного равенства. Если нужно проверить значение объекта, используйте toEqual:
test('object assignment', () => {
const data = {one: 1};
data['two'] = 2;
expect(data).toEqual({one: 1, two: 2});
});
toEqual рекурсивно проверяет каждое поле объекта или массива.
toEqual игнорирует ключи объектов со свойствами undefined, элементы массива undefined, разреженность массивов и несовпадение типов объектов. Чтобы учитывать эти различия, используйте вместо него toStrictEqual.
Вы также можете проверить противоположное условию матчера с помощью not:
test('adding positive numbers is not zero', () => {
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считает истинным -
toBeFalsyсоответствует всему, что операторifсчитает ложным
Например:
test('null', () => {
const n = null;
expect(n).toBeNull();
expect(n).toBeDefined();
expect(n).not.toBeUndefined();
expect(n).not.toBeTruthy();
expect(n).toBeFalsy();
});
test('zero', () => {
const z = 0;
expect(z).not.toBeNull();
expect(z).toBeDefined();
expect(z).not.toBeUndefined();
expect(z).not.toBeTruthy();
expect(z).toBeFalsy();
});
Используйте матчер, который наиболее точно соответствует тому, что должен делать ваш код.
Числа
Для большинства способов сравнения чисел есть соответствующие матчеры.
test('two plus two', () => {
const value = 2 + 2;
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3.5);
expect(value).toBeLessThan(5);
expect(value).toBeLessThanOrEqual(4.5);
// toBe and toEqual are equivalent for numbers
expect(value).toBe(4);
expect(value).toEqual(4);
});
Для сравнения чисел с плавающей точкой используйте toBeCloseTo вместо toEqual, поскольку тест не должен зависеть от незначительной ошибки округления.
test('adding floating point numbers', () => {
const value = 0.1 + 0.2;
//expect(value).toBe(0.3); This won't work because of rounding error
expect(value).toBeCloseTo(0.3); // This works.
});
Строки
Вы можете проверить строку на соответствие регулярному выражению с помощью toMatch:
test('there is no I in team', () => {
expect('team').not.toMatch(/I/);
});
test('but there is a "stop" in Christoph', () => {
expect('Christoph').toMatch(/stop/);
});
Массивы и итерируемые объекты
Вы можете проверить, содержит ли массив или итерируемый объект определённый элемент, с помощью 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
});
Функцию, выбрасывающую исключение, необходимо вызвать внутри обёртывающей функции, иначе проверка toThrow завершится ошибкой.
И многое другое
Это лишь краткий обзор. Полный список матчеров см. в справочной документации.
Изучив доступные матчеры, вы можете перейти к тому, как Jest позволяет тестировать асинхронный код.
© 2022 Facebook, Inc.
Licensed under the MIT License.
https://jestjs.io/docs/using-matchers