Программный API

Jasmine представляет собой популярный фреймворк для тестирования JavaScript-программ, ориентированный на поведение (Behavior-Driven Development — BDD). Он предоставляет удобный и простой в использовании API, который позволяет разработчикам писать тесты для своих приложений. В этой главе рассматривается ключевая часть фреймворка — его программный API, который используется для создания, организации и выполнения тестов.

Основные элементы API

Jasmine API состоит из нескольких основных методов, которые используются для организации тестов и работы с ними. Это такие методы, как describe, it, beforeEach, afterEach, expect и другие.

describe

Метод describe используется для группировки связанных тестов. Он позволяет создавать блоки, в которые помещаются несколько тестов, что помогает структурировать код и улучшить читаемость тестов.

describe('Математические операции', function() {
  it('должен возвращать правильный результат при сложении', function() {
    expect(2 + 3).toBe(5);
  });

  it('должен возвращать правильный результат при вычитании', function() {
    expect(5 - 3).toBe(2);
  });
});

describe принимает два аргумента: строку, описывающую группу тестов, и функцию, которая определяет сами тесты.

it

Метод it используется для определения отдельного теста. Он принимает строку с описанием теста и функцию, которая содержит логику самого теста.

it('должен проверять равенство двух чисел', function() {
  expect(5).toBe(5);
});

Тесты, определённые с помощью it, могут использовать различные матчеры (например, toBe, toEqual, toBeTruthy), которые определяют, что именно проверяется в тестируемой функции.

beforeEach и afterEach

Методы beforeEach и afterEach предоставляют возможность выполнения действий до и после каждого теста соответственно. Это особенно полезно для подготовки данных или очищения состояния между тестами.

describe('Классы и объекты', function() {
  let obj;

  beforeEach(function() {
    obj = { a: 1, b: 2 };
  });

  afterEach(function() {
    obj = null;
  });

  it('должен проверять правильность значений', function() {
    expect(obj.a).toBe(1);
    expect(obj.b).toBe(2);
  });
});

beforeEach выполняется перед каждым тестом, а afterEach — после каждого. Эти методы полезны, когда необходимо восстановить состояние тестируемого объекта.

beforeAll и afterAll

Методы beforeAll и afterAll работают аналогично beforeEach и afterEach, но выполняются только один раз для всего блока describe, а не для каждого теста.

describe('Тестирование API', function() {
  let api;

  beforeAll(function() {
    api = new ApiClient();
  });

  afterAll(function() {
    api.close();
  });

  it('должен получать данные с сервера', function() {
    expect(api.getData()).toBeDefined();
  });
});

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

Сопоставление значений с матчерами

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

  • toBe(value) — проверяет, равны ли два значения (по ссылке для объектов).
  • toEqual(value) — проверяет, равны ли два значения по содержимому.
  • toBeTruthy() — проверяет, что значение является истинным.
  • toBeFalsy() — проверяет, что значение является ложным.
  • toContain(value) — проверяет, что массив или строка содержит определённое значение.
  • toThrow() — проверяет, что функция выбрасывает исключение.

Пример:

it('должен проверять, что значение является истинным', function() {
  let val = true;
  expect(val).toBeTruthy();
});

Тестирование асинхронного кода

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

it('должен загружать данные с сервера', function(done) {
  api.getData().then(function(data) {
    expect(data).toBeDefined();
    done();
  });
});

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

Спецификации и моки

Jasmine также поддерживает моки и шпионов, которые используются для тестирования взаимодействий между объектами и функциями.

Шпионы

Шпион — это объект, который позволяет отслеживать вызовы функций, параметры и возвращаемые значения. Для создания шпионов используется метод spyOn.

it('должен проверять вызов метода', function() {
  let obj = {
    greet: function(name) {
      return 'Hello ' + name;
    }
  };

  spyOn(obj, 'greet');
  obj.greet('John');

  expect(obj.greet).toHaveBeenCalledWith('John');
});

Метод spyOn создаёт шпион на указанном методе объекта и позволяет отслеживать, был ли он вызван, сколько раз и с какими параметрами.

Моки

Мок — это объект, который заменяет реальные объекты или функции в тестах. Моки часто используются для тестирования внешних зависимостей, таких как API или базы данных.

Jasmine предоставляет метод mock для создания таких объектов, но чаще всего моки создаются вручную, используя шпионов.

Настройки и конфигурация Jasmine

Jasmine также поддерживает различные настройки, которые позволяют изменять поведение фреймворка. Для этого используется объект конфигурации jasmine.getEnv().

jasmine.getEnv().addReporter(new jasmine.ConsoleReporter());

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

Для настройки времени тайм-аутов и других параметров используется объект jasmine.DEFAULT_TIMEOUT_INTERVAL.

jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;

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

Заключение

Jasmine предоставляет мощный и гибкий API, который подходит как для простых, так и для сложных проектов. Грамотное использование методов, матчеров и вспомогательных функций позволяет создавать тесты, которые легко поддерживать и расширять. Программный API Jasmine охватывает все аспекты тестирования, от организации тестов до работы с асинхронным кодом и создания моков и шпионов, что делает его незаменимым инструментом для современных JavaScript-разработчиков.