Unit-тестирование — важная часть разработки на Riot.js, позволяющая проверять отдельные компоненты и их поведение в изоляции. В экосистеме JavaScript для этих целей чаще всего используют Jest и Mocha, которые обеспечивают гибкие возможности для написания тестов, проверки асинхронного кода и мокирования зависимостей.
Для начала необходимо установить основные зависимости:
npm install --save-dev jest @testing-library/jest-dom @testing-library/dom @riotjs/riot
npm install --save-dev mocha chai sinon
chai) и mocks
(sinon).Riot-компоненты представляют собой веб-компоненты с внутренней
логикой, шаблонами и состоянием. Для их тестирования необходимо
интегрировать библиотеку @riotjs/riot с DOM-тестовой
библиотекой, такой как @testing-library/dom.
Типичная структура теста выглядит следующим образом:
Пример на Jest:
import { component } from '@riotjs/riot'
import { render, fireEvent, screen } from '@testing-library/dom'
import Counter from './counter.riot'
describe('Counter компонент', () => {
let root
beforeEach(() => {
root = document.createElement('div')
render(Counter, {}, root)
})
it('должен отображать начальное значение', () => {
expect(root.textContent).toContain('0')
})
it('увеличивает значение при клике на кнопку', async () => {
const button = screen.getByText('Increment')
await fireEvent.click(button)
expect(root.textContent).toContain('1')
})
})
Ключевые моменты:
render монтирует компонент в DOM, позволяя проверять
его визуальное состояние.fireEvent симулирует события пользователя.Mocha позволяет создавать более гибкую структуру тестов и интегрироваться с Sinon для мокирования:
import { component } from '@riotjs/riot'
import { expect } from 'chai'
import sinon from 'sinon'
import Counter from './counter.riot'
describe('Counter компонент', () => {
let root
beforeEach(() => {
root = document.createElement('div')
component(Counter)(root)
})
it('инициализируется с нулевым значением', () => {
expect(root.textContent).to.include('0')
})
it('увеличивает счет при вызове handleIncrement', () => {
const instance = root._riot
instance.handleIncrement()
expect(root.textContent).to.include('1')
})
})
Отличительные особенности Mocha:
describe и it с
понятной структурой.beforeEach и
afterEach для подготовки состояния.sinon.Riot-компоненты часто используют асинхронные операции: запросы к API, таймеры, анимации. Для их тестирования важно правильно обрабатывать промисы и асинхронные события.
Пример с Jest:
it('загружает данные из API', async () => {
const fetchMock = jest.spyOn(global, 'fetch').mockResolvedValue({
json: () => Promise.resolve({ value: 42 })
})
render(Counter, {}, root)
await Promise.resolve() // ожидание асинхронного обновления компонента
expect(root.textContent).toContain('42')
fetchMock.mockRestore()
})
Особенности:
jest.spyOn позволяет перехватывать вызовы глобальных
функций.await и
ожидание промисов.Unit-тестирование требует изоляции компонентов от внешних сервисов. Riot-компоненты могут зависеть от других компонентов, сервисов или глобальных объектов.
Пример с Mocha + Sinon:
it('вызывает метод сервиса при событии', () => {
const service = { save: sinon.spy() }
const instance = component(Counter, { service })(root)
instance.handleSave()
expect(service.save.calledOnce).to.be.true
})
Ключевые моменты:
spy, stub,
mock для точной проверки вызовов.Для контроля качества кода используется покрытие тестами:
jest --coverage
async/await и
промисы, чтобы избежать гонок и ошибок тайминга.Unit-тестирование в Riot.js с Jest и Mocha обеспечивает высокое качество компонентов и упрощает поддержку приложения. Сочетание тестовых раннеров, библиотек для проверки DOM и инструментов мокирования позволяет писать надежные и изолированные тесты для любых сценариев.