Установка и первоначальная настройка

Для начала необходимо установить сам Mocha. Это можно сделать с помощью npm (Node Package Manager), который является стандартом для работы с зависимостями в Node.js.

  1. Инициализация проекта:

    Если проект ещё не инициализирован, для начала нужно создать package.json файл. Для этого достаточно выполнить команду:

    npm init -y

    Она создаст минимальный package.json, который будет необходим для работы с зависимостями.

  2. Установка Mocha:

    Для установки Mocha в проект следует выполнить следующую команду:

    npm install mocha --save-dev

    Параметр --save-dev добавляет Mocha в секцию devDependencies в package.json, что означает, что Mocha будет использоваться только в процессе разработки, а не на продакшн-сервере.

  3. Проверка установки:

    После установки можно проверить, что Mocha установлен правильно, запустив команду:

    ./node_modules/.bin/mocha --version

    Это вернёт текущую версию Mocha, что подтверждает успешную установку.

Структура проекта

Для удобства тестирования рекомендуется организовать проект в следующей структуре:

/project
  /node_modules
  /test
    test.js
  package.json

В каталоге test будут храниться все тестовые файлы, что позволяет легко организовать и поддерживать тестирование. Этот каталог не является обязательным, но является хорошей практикой.

Настройка Mocha

Mocha предоставляет множество конфигурационных опций, которые можно задать для каждого теста или для всей тестовой среды в целом. Эти опции могут быть переданы через командную строку или через файл конфигурации.

  1. Конфигурация через командную строку:

    Mocha поддерживает различные флаги и параметры, которые можно передавать через командную строку. Например:

    • –reporter — указывает тип отчётности (например, spec, dot, nyan).
    • –recursive — включает поиск тестовых файлов во всех подкаталогах.
    • –timeout — устанавливает максимальное время на выполнение теста.

    Пример запуска с параметрами:

    ./node_modules/.bin/mocha --reporter spec --timeout 5000

    Это выполнит тесты с использованием репортера spec и установит таймаут в 5000 миллисекунд (5 секунд) для каждого теста.

  2. Конфигурация через файл:

    Вместо того, чтобы указывать параметры каждый раз в командной строке, можно использовать конфигурационный файл mocha.opts или .mocharc.json. Этот файл должен быть размещён в корневом каталоге проекта, в котором запускаются тесты.

    Пример содержимого файла mocha.opts:

    --reporter spec
    --timeout 5000

    Таким образом, каждый раз, когда будет запускаться Mocha, эти параметры будут использоваться автоматически.

Запуск тестов

После установки и настройки Mocha можно начать запускать тесты. В простейшем случае это делается с помощью следующей команды:

./node_modules/.bin/mocha

По умолчанию Mocha будет искать все файлы, соответствующие паттерну test//*.js**, и выполнять тесты в этих файлах. При этом тесты могут быть организованы в виде отдельных функций или классов.

Пример теста:

const assert = require('assert');

describe('Математические операции', function() {
  it('должен складывать два числа', function() {
    assert.strictEqual(1 + 1, 2);
  });
});

В данном примере используется функция describe, которая организует тесты в группы, и функция it, которая описывает конкретный тест. Метод assert.strictEqual проверяет, что сумма чисел действительно равна 2.

Использование пакетов для расширения функционала

Mocha имеет отличную совместимость с множеством дополнительных библиотек, которые могут помочь в организации тестирования, например:

  • Chai — библиотека для утверждений, предоставляющая более гибкие и выразительные методы для тестирования.
  • Sinon — позволяет моки, стабы и шпионы для работы с асинхронными функциями и сложными объектами.

Для установки этих пакетов можно использовать следующие команды:

npm install chai --save-dev
npm install sinon --save-dev

Пример использования Chai с Mocha:

const chai = require('chai');
const expect = chai.expect;

describe('Проверка чисел', function() {
  it('должен проверять, что число больше нуля', function() {
    expect(5).to.be.above(0);
  });
});

Асинхронные тесты

Mocha поддерживает асинхронное тестирование, что позволяет работать с функциями, которые выполняются асинхронно (например, с операциями чтения файлов, запросами к серверу и т.д.).

Чтобы сделать тест асинхронным, необходимо либо использовать callback (передавая функцию в тест), либо возвращать промис или использовать async/await.

Пример с callback:

describe('Асинхронный тест', function() {
  it('должен выполнить асинхронную операцию', function(done) {
    setTimeout(function() {
      assert.strictEqual(2 + 2, 4);
      done(); // Вызов done сообщает Mocha, что тест завершён
    }, 1000);
  });
});

Пример с промисом:

describe('Тест с промисом', function() {
  it('должен вернуть результат', function() {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        resolve(5 + 5);
      }, 1000);
    }).then(result => {
      assert.strictEqual(result, 10);
    });
  });
});

Пример с async/await:

describe('Асинхронный тест с async/await', function() {
  it('должен вернуть результат', async function() {
    const result = await new Promise((resolve) => setTimeout(() => resolve(5 + 5), 1000));
    assert.strictEqual(result, 10);
  });
});

Заключение

Mocha — это мощный инструмент для тестирования JavaScript-кода, который позволяет легко организовать тесты, использовать различные репортеры и настраивать выполнение тестов. Он имеет множество возможностей для интеграции с другими инструментами, такими как Chai и Sinon, и поддерживает как синхронные, так и асинхронные тесты.