Cypress использует библиотеку Chai для проверки условий в тестах. Chai обеспечивает гибкий и выразительный синтаксис для утверждений (assertions), позволяя писать тесты, которые легко читаются и поддерживаются. В Cypress assertions делятся на три основные категории: should, expect и assert, каждая из которых имеет свои особенности применения.
Метод 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 используется для независимых проверок значений
или объектов, без привязки к элементу 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 предлагает стиль утверждений, похожий на
классические тестовые фреймворки. Он менее цепочный, но удобен для
прямых проверок.
Пример использования:
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 поддерживает множество встроенных матчеров:
.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()
should.expect.assert удобен для быстрого и прямого сравнения
значений, особенно если требуется сообщение об ошибке.and повышает читаемость и
сокращает дублирование get.deep.equal).expect для элементов Cypress без
then приведет к проверке до рендеринга элемента.should с функцией обратного вызова требует
явного возврата значения или проверки через expect.