Jasmine — это фреймворк для тестирования JavaScript-кода, ориентированный на поведение приложения. Основная цель Jasmine — создание чётких, читаемых и поддерживаемых тестов, которые позволяют проверить корректность работы функций, классов и модулей. Рассмотрим процесс написания первого теста и основные конструкции, используемые в Jasmine.
Для работы с Jasmine в проекте можно использовать npm:
npm install --save-dev jasmine
После установки инициализируется конфигурация:
npx jasmine init
Это создаст базовую структуру проекта с папкой spec для
тестов и конфигурационным файлом
spec/support/jasmine.json.
Jasmine использует описательный синтаксис для создания тестов. Основные элементы:
describe — блок, группирующий тесты
по смыслу. Используется для описания функциональности или
компонента.
it — отдельный тест, проверяющий
конкретное поведение.
expect — утверждение, проверяющее
соответствие результата ожиданию.
Matchers — методы, определяющие, как именно
проверяется значение (toBe, toEqual,
toContain и др.).
Пример базового теста:
describe("Функция сложения", () => {
it("должна возвращать сумму двух чисел", () => {
function add(a, b) {
return a + b;
}
expect(add(2, 3)).toBe(5);
expect(add(-1, 1)).toBe(0);
});
});
Здесь describe описывает тестируемую функциональность, а
it формулирует конкретное поведение. expect
проверяет, что результат функции совпадает с ожидаемым значением.
describe позволяют
структурировать тесты по уровням: модуль → функция → конкретный
сценарий.it должен быть самодостаточным
и проверять только одно поведение.Пример вложенных блоков:
describe("Математические операции", () => {
describe("Сложение", () => {
it("должно складывать положительные числа", () => {
expect(2 + 3).toBe(5);
});
it("должно складывать отрицательные числа", () => {
expect(-2 + -3).toBe(-5);
});
});
describe("Вычитание", () => {
it("должно вычитать числа", () => {
expect(5 - 3).toBe(2);
});
});
});
Jasmine предоставляет широкий набор методов для проверок:
toBe(value) — проверка идентичности (===).toEqual(value) — глубокое сравнение объектов или
массивов.toBeTruthy() / toBeFalsy() — проверка на
логические значения.toContain(item) — проверка наличия элемента в массиве
или подстроки в строке.toBeDefined() / toBeUndefined() — проверка
существования значения.toThrow() — проверка выбрасывания исключения.Пример использования нескольких матчеров:
describe("Проверка объектов и массивов", () => {
it("должно сравнивать массивы", () => {
const arr = [1, 2, 3];
expect(arr).toEqual([1, 2, 3]);
expect(arr).toContain(2);
});
it("должно проверять выброс ошибки", () => {
function errorFunc() {
throw new Error("Ошибка!");
}
expect(errorFunc).toThrow();
});
});
Jasmine предоставляет хуки для выполнения кода до или после тестов:
beforeEach — выполняется перед каждым
it.afterEach — выполняется после каждого
it.beforeAll — выполняется один раз до
всех тестов.afterAll — выполняется один раз после
всех тестов.Пример с хуками:
describe("Работа с массивом", () => {
let arr;
beforeEach(() => {
arr = [1, 2, 3];
});
afterEach(() => {
arr = [];
});
it("добавление элемента", () => {
arr.push(4);
expect(arr).toContain(4);
});
it("удаление элемента", () => {
arr.pop();
expect(arr).not.toContain(3);
});
});
Хуки обеспечивают изолированность тестов, что позволяет избежать нежелательного влияния одного теста на другой.
Jasmine поддерживает проверку асинхронного кода через done callback, промисы или async/await.
Пример с done:
describe("Асинхронная функция", () => {
it("должна завершиться через 1 секунду", (done) => {
setTimeout(() => {
expect(true).toBe(true);
done();
}, 1000);
});
});
Пример с async/await:
describe("Проверка промиса", () => {
it("должен вернуть данные", async () => {
async function fetchData() {
return 42;
}
const result = await fetchData();
expect(result).toBe(42);
});
});
describe и it должны
отражать смысл проверки.Первый тест в Jasmine служит основой для формирования привычки писать чёткие и изолированные проверки. Это позволяет постепенно строить сложные тестовые сценарии, охватывая функциональность всего приложения.