Chai assertions

Cypress использует библиотеку Chai для проверки условий в тестах. Chai обеспечивает гибкий и выразительный синтаксис для утверждений (assertions), позволяя писать тесты, которые легко читаются и поддерживаются. В Cypress assertions делятся на три основные категории: should, expect и assert, каждая из которых имеет свои особенности применения.


Should assertions

Метод should применяется напрямую к объектам Cypress, например, к элементам DOM. Он позволяет делать проверки с использованием цепочек команд и автоматически ждет, пока условие станет истинным, что особенно важно для асинхронного взаимодействия с DOM.

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

cy.get('button').should('be.visible')
cy.get('input').should('have.value', 'тестовое значение')
cy.get('div').should('contain.text', 'Привет')

Ключевые моменты:

  • be.visible проверяет, что элемент видим.
  • have.value проверяет значение поля ввода.
  • contain.text проверяет текстовое содержание элемента.

Можно комбинировать несколько условий:

cy.get('button').should('be.visible').and('not.be.disabled')

Expect assertions

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

Пример:

const result = 5 + 5
expect(result).to.equal(10)
expect([1, 2, 3]).to.include(2)
expect('Cypress').to.have.length(7)

Основные методы Chai с expect:

  • .to.equal(value) — строгая проверка на равенство.
  • .to.include(value) — проверка наличия элемента в массиве или подстроки в строке.
  • .to.have.length(n) — проверка длины массива или строки.
  • .to.be.true / .to.be.false — логические значения.
  • .to.be.null / .to.be.undefined — проверка пустых значений.

Для сложных объектов можно использовать глубокое сравнение:

expect({a:1, b:2}).to.deep.equal({a:1, b:2})

Assert assertions

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

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

assert.equal(5 + 5, 10, 'Сумма должна быть 10')
assert.isTrue(true, 'Значение должно быть true')
assert.include([1,2,3], 2, 'Массив содержит 2')

Популярные методы:

  • assert.equal(actual, expected, message) — проверка на равенство.
  • assert.notEqual(actual, expected, message) — проверка на неравенство.
  • assert.isTrue(value, message) — проверка логического значения.
  • assert.isNull(value, message) — проверка на null.
  • assert.include(haystack, needle, message) — проверка включения элемента.

Работа с асинхронными значениями

Cypress автоматически обрабатывает ожидания для элементов и их состояния. Это делает should особенно полезным для асинхронных проверок:

cy.get('.notification').should('contain.text', 'Успешно')

В отличие от expect, который проверяет значение моментально, should будет повторно опрашивать DOM до тех пор, пока условие не станет истинным или не истечет таймаут.

Для проверки API-ответов можно использовать then с expect:

cy.request('/api/users').then((response) => {
    expect(response.status).to.equal(200)
    expect(response.body).to.have.length.greaterThan(0)
})

Встроенные и кастомные Chai matchers

Chai поддерживает множество встроенных матчеров:

  • .empty — пустой элемент или массив.
  • .above / .below — проверка числовых значений.
  • .match — проверка регулярного выражения.

Можно добавлять кастомные матчеры через плагины:

chai.use((_chai, utils) => {
    _chai.Assertion.addMethod('isEven', function () {
        const value = utils.flag(this, 'object')
        this.assert(
            value % 2 === 0,
            'ожидалось, что #{this} будет четным',
            'ожидалось, что #{this} не будет четным'
        )
    })
})

expect(4).to.be.isEven()

Практические рекомендации

  • Для проверки состояния элементов DOM предпочтительнее использовать should.
  • Для проверки переменных, объектов или ответов API лучше применять expect.
  • assert удобен для быстрого и прямого сравнения значений, особенно если требуется сообщение об ошибке.
  • Использование цепочек and повышает читаемость и сокращает дублирование get.
  • Для сложных объектов и массивов рекомендуется использовать глубокие проверки (deep.equal).

Типичные ошибки

  • Использование expect для элементов Cypress без then приведет к проверке до рендеринга элемента.
  • Применение should с функцией обратного вызова требует явного возврата значения или проверки через expect.
  • Игнорирование таймаутов при асинхронных операциях может приводить к ложным падениям тестов.