В Jasmine ключевым элементом для проверки значений являются
матчеры — функции, позволяющие сравнивать ожидаемый
результат с реальным. Иногда необходимо не только проверять соответствие
определённым условиям, но и обратное соответствие. Для
этого используется ключевое слово not, которое позволяет
инвертировать поведение матчеров.
notnot применяется непосредственно перед матчером и
изменяет его смысл на противоположный. Структура записи выглядит
так:
expect(actual).not.matcher(expected);
actual — значение, которое проверяется.matcher — функция-сравнитель (например,
toBe, toEqual).expected — ожидаемое значение.Использование not позволяет писать проверки типа:
expect(5).not.toBe(10); // Проверка, что 5 не равно 10
expect([1, 2]).not.toEqual([3, 4]); // Проверка, что массивы не равны
Важно понимать, что not работает только с
матчером, который следует за ним, и не влияет на другие
ожидания в том же тесте.
Проверяет строгую равенство (===):
expect(true).not.toBe(false);
expect("hello").not.toBe("world");
Сравнивает содержимое объектов или массивов:
const user = { name: "Alice", age: 25 };
expect(user).not.toEqual({ name: "Bob", age: 25 });
const arr = [1, 2, 3];
expect(arr).not.toEqual([4, 5, 6]);
Проверяет наличие элемента в массиве или подстроки в строке:
const fruits = ["apple", "banana"];
expect(fruits).not.toContain("orange");
const str = "JavaScript";
expect(str).not.toContain("Python");
Позволяет проверить логическое значение:
expect(false).not.toBeTruthy();
expect(1).not.toBeFalsy();
В Jasmine матчеры можно комбинировать цепочками. При
этом not может стоять в начале цепочки,
влияя на весь матчинг. Пример использования:
expect([1, 2, 3]).not.toContain(4);
expect("OpenAI").not.toMatch(/Closed/);
expect(10).not.toBeLessThan(5);
Особенности работы:
not применяется к следующему матчеру,
и нельзя инвертировать весь блок ожиданий сразу.not действует локально:expect(7).not.toBeGreaterThan(10); // корректно
expect(7).not.toBeGreaterThan(5).toBeLessThan(10);
// первое условие инвертировано, второе выполняется как обычная проверка
not с кастомными матчерамиJasmine позволяет создавать пользовательские
матчеры, и not можно применять к ним так же, как к
встроенным:
beforeEach(() => {
jasmine.addMatchers({
toBeDivisibleBy: () => ({
compare: (actual, expected) => ({
pass: actual % expected === 0,
message: `${actual} не делится на ${expected}`
})
})
});
});
it("проверка кастомного матчера с not", () => {
expect(7).not.toBeDivisibleBy(3); // 7 не делится на 3
});
not следует только тогда, когда действительно
нужна обратная проверка.expect,
чтобы каждая проверка была читабельной и
предсказуемой.not важно помнить локальный
эффект — каждая инверсия касается только одного
матчера.toContain, toEqual или кастомные матчеры, так
как toBe проверяет только ссылочную идентичность.const numbers = [10, 20, 30];
expect(numbers).not.toContain(40);
const phrase = "Testing Jasmine";
expect(phrase).not.toMatch(/Cucumber/);
const person = { name: "John", age: 30 };
expect(person).not.toEqual({ name: "Jane", age: 30 });
not:expect(15).not.toBeDivisibleBy(4);
expect(18).not.toBeDivisibleBy(7);
Цепочки матчеров с not позволяют создавать
гибкие и выразительные тесты, инвертируя поведение
стандартных проверок и повышая читаемость кода. Правильное использование
not делает тесты более наглядными и позволяет однозначно
выражать условия отсутствия или несоответствия.