String matchers

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

toBe и toEqual для строк

Оба матчера проверяют равенство, но важно понимать различия:

  • toBe сравнивает строки по ссылке и значению. Для строк это фактически проверка по значению, так как строки в JavaScript неизменяемы.
it("проверяет точное равенство строк", () => {
  const str = "Hello, Jasmine!";
  expect(str).toBe("Hello, Jasmine!");
});
  • toEqual проверяет глубокое равенство. Для примитивов, таких как строки, результат идентичен toBe.
it("проверяет эквивалентность строк", () => {
  const str = "Test string";
  expect(str).toEqual("Test string");
});

toMatch — проверка по регулярному выражению

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

it("проверяет наличие подстроки с помощью регулярного выражения", () => {
  const email = "user@example.com";
  expect(email).toMatch(/.+@.+\..+/);
});

Особенности использования:

  • Регулярное выражение можно передавать напрямую, либо использовать строку.
  • toMatch возвращает успешный результат, если строка соответствует шаблону полностью или частично, в зависимости от регулярного выражения.
it("проверяет начало строки", () => {
  const greeting = "Hello, world!";
  expect(greeting).toMatch(/^Hello/);
});

Проверка отсутствия подстроки

Для проверки отсутствия подстроки используется отрицание с not.

it("проверяет, что строки не содержат определённую подстроку", () => {
  const phrase = "Testing Jasmine matchers";
  expect(phrase).not.toMatch(/Angular/);
});

Сочетание строковых матчеров с другими матчерами

Строковые матчеры можно комбинировать с другими проверками для создания более комплексных условий. Например:

it("комбинирует проверки длины и содержания строки", () => {
  const password = "Secure123!";
  expect(password.length).toBeGreaterThan(8);
  expect(password).toMatch(/[A-Z]/);
  expect(password).toMatch(/[0-9]/);
});

Практические советы по тестированию строк

  1. Использовать toMatch для гибких проверок. Если важна точная строка, лучше toBe или toEqual.
  2. Регулярные выражения должны быть читаемыми. Избыточная сложность усложняет поддержку тестов.
  3. Не полагаться на toBe для объектов строк, созданных через new String(). Они сравниваются по ссылке, что может дать ложный отрицательный результат.
  4. Отрицательные проверки с not повышают надёжность теста, особенно при проверке на отсутствие определённых слов или символов.

Примеры сложных строковых матчеров

describe("сложные проверки строк", () => {
  const url = "https://example.com/path?query=123";

  it("содержит протокол https", () => {
    expect(url).toMatch(/^https:\/\//);
  });

  it("содержит домен example.com", () => {
    expect(url).toMatch(/example\.com/);
  });

  it("не содержит localhost", () => {
    expect(url).not.toMatch(/localhost/);
  });
});

Проверка пустой строки

Для проверки пустой строки удобно использовать toBe с "".

it("проверяет пустую строку", () => {
  const empty = "";
  expect(empty).toBe("");
});

Итоговая структура тестов с строковыми матчерами

  • Использовать toBe/toEqual для точного совпадения.
  • Использовать toMatch для подстрок или шаблонов.
  • Добавлять отрицательные проверки через not.
  • Комбинировать проверки длины, содержания и формата.

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