Первый тест на Jasmine

Jasmine — это фреймворк для тестирования JavaScript-кода, ориентированный на поведение приложения. Основная цель Jasmine — создание чётких, читаемых и поддерживаемых тестов, которые позволяют проверить корректность работы функций, классов и модулей. Рассмотрим процесс написания первого теста и основные конструкции, используемые в Jasmine.


Установка и подключение

Для работы с Jasmine в проекте можно использовать npm:

npm install --save-dev jasmine

После установки инициализируется конфигурация:

npx jasmine init

Это создаст базовую структуру проекта с папкой spec для тестов и конфигурационным файлом spec/support/jasmine.json.


Основные конструкции

Jasmine использует описательный синтаксис для создания тестов. Основные элементы:

  1. describe — блок, группирующий тесты по смыслу. Используется для описания функциональности или компонента.

  2. it — отдельный тест, проверяющий конкретное поведение.

  3. expect — утверждение, проверяющее соответствие результата ожиданию.

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

});

Matchers (методы проверки)

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 служит основой для формирования привычки писать чёткие и изолированные проверки. Это позволяет постепенно строить сложные тестовые сценарии, охватывая функциональность всего приложения.