Работа с Node.js assert

Mocha — это один из самых популярных фреймворков для тестирования JavaScript-кода. Он предоставляет мощные возможности для тестирования, включая различные ассерты для проверки корректности работы программного обеспечения. В Node.js стандартной библиотекой для выполнения ассертов является модуль assert. Этот модуль предоставляет набор функций для тестирования условий, которые должны быть истинными в рамках выполнения кода. Использование assert в сочетании с Mocha позволяет легко проверять логику программ и автоматически проверять их корректность.

Что такое модуль assert?

Модуль assert является встроенным модулем Node.js и предоставляет методы для выполнения утверждений. Утверждения (ассерты) — это проверки, которые утверждают, что некоторое условие является истинным. Если условие ложно, выбрасывается ошибка, которая прерывает выполнение теста. Если условие истинно, тест продолжается.

const assert = require('assert');

assert.strictEqual(2 + 2, 4);  // Утверждение пройдет
assert.strictEqual(2 + 2, 5);  // Бросит ошибку, тест не пройдет

Основные методы assert

  1. assert.strictEqual(actual, expected, [message]) Проверяет, что два значения строго равны. Это означает, что они должны быть одинаковыми по типу и значению. Если значения не равны, выбрасывается ошибка.

    Пример:

    assert.strictEqual(2 + 2, 4);  // Утверждение проходит
    assert.strictEqual('2' + '2', '22');  // Утверждение проходит
    assert.strictEqual(2 + 2, '4');  // Бросит ошибку, т.к. типы разных значений различны
  2. assert.deepEqual(actual, expected, [message]) Сравнивает два объекта или массива на глубокое равенство. Это значит, что сравниваются их свойства или элементы, а не ссылки на них. При этом порядок свойств или элементов имеет значение.

    Пример:

    assert.deepEqual({ a: 1, b: 2 }, { a: 1, b: 2 });  // Утверждение проходит
    assert.deepEqual([1, 2], [1, 2]);  // Утверждение проходит
  3. assert.notStrictEqual(actual, expected, [message]) Проверяет, что два значения не равны строго. Если они равны, выбрасывается ошибка.

    Пример:

    assert.notStrictEqual(2 + 2, 5);  // Утверждение проходит
    assert.notStrictEqual(2 + 2, 4);  // Бросит ошибку, т.к. значения равны
  4. assert.notDeepEqual(actual, expected, [message]) Проверяет, что два объекта или массива не равны на уровне глубокого сравнения.

    Пример:

    assert.notDeepEqual({ a: 1 }, { b: 2 });  // Утверждение проходит
    assert.notDeepEqual([1, 2], [2, 1]);  // Утверждение проходит
  5. assert.ok(value, [message]) Проверяет, что значение является истинным (не является false, null, undefined, 0, NaN или пустой строкой). Если значение ложно, выбрасывается ошибка.

    Пример:

    assert.ok(42);  // Утверждение проходит
    assert.ok('string');  // Утверждение проходит
    assert.ok(0);  // Бросит ошибку, т.к. 0 — ложное значение
  6. assert.fail([message]) Является специальным методом для явного выбрасывания ошибки. Обычно используется в случаях, когда необходимо явно вызвать сбой теста.

    Пример:

    assert.fail('Тест не прошел');  // Бросит ошибку с сообщением
  7. assert.throws(block, [error], [message]) Проверяет, что выполнение блока кода (функции) вызывает ошибку. Этот метод особенно полезен для тестирования исключений.

    Пример:

    assert.throws(() => {
      throw new Error('Ошибка');
    }, /Ошибка/);  // Утверждение проходит

Использование assert в Mocha

Mocha предоставляет структуру для написания тестов с использованием различных ассертов, в том числе модуля assert. В тестах Mocha можно удобно сочетать ассерты с различными функциями, такими как before, after, beforeEach, и afterEach, чтобы подготовить тестовую среду и проводить тестирование кода.

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

const assert = require('assert');

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

  it('Деление на ноль должно бросить ошибку', () => {
    assert.throws(() => {
      let result = 1 / 0;
    }, /Infinity/);
  });
});

В данном примере:

  • Тест проверяет правильность выполнения арифметической операции.
  • Во втором тесте проверяется, что деление на ноль вызывает ошибку.

Ассерт с асинхронным кодом

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

Пример асинхронного теста с использованием assert:

const assert = require('assert');
const fs = require('fs');

describe('Чтение файла', () => {
  it('файл должен содержать текст', (done) => {
    fs.readFile('test.txt', 'utf8', (err, data) => {
      if (err) done(err);
      assert.ok(data.includes('Hello, world!'));
      done();
    });
  });
});

Здесь:

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

Выводы

Использование модуля assert в Mocha делает тестирование JavaScript-кода удобным и мощным инструментом. Встроенные методы ассертов позволяют легко проверять различные условия, будь то строгие сравнения, глубокие сравнения или проверка на ошибки. В комбинации с Mocha, который организует тесты и их выполнение, assert становится идеальным инструментом для тестирования логики кода, что значительно упрощает процесс разработки и обеспечивает высокое качество программного обеспечения.