Интеграционное тестирование в контексте Riot.js направлено на проверку взаимодействия компонентов, тегов, сторов и внешних зависимостей как единого целого. В отличие от модульных тестов, здесь акцент смещается с изолированной логики на корректность связей: передача данных через props, работа реактивных обновлений, обработка событий и жизненные циклы тегов.
Riot.js строится вокруг кастомных тегов, которые инкапсулируют шаблон, логику и стили. В реальных приложениях теги редко существуют поодиночке:
Интеграционные тесты позволяют проверить, что:
Для интеграционного тестирования Riot.js чаще всего используется связка:
Riot.js не навязывает собственный тестовый фреймворк, поэтому экосистема JavaScript используется напрямую.
Для корректной работы интеграционных тестов необходимо эмулировать браузерную среду:
import { component } from 'riot'
import MyApp from '../src/my-app.riot'
document.body.innerHTML = '<div id="root"></div>'
Jest по умолчанию использует jsdom, что позволяет:
document;Базовый сценарий интеграционного теста — монтирование корневого тега и проверка его дочерних элементов:
test('приложение рендерит список элементов', () => {
const mount = component(MyApp)
const instance = mount(document.getElementById('root'), {
items: ['A', 'B', 'C']
})
const listItems = document.querySelectorAll('li')
expect(listItems.length).toBe(3)
})
Здесь проверяется сразу несколько аспектов:
Одно из ключевых свойств Riot.js — реактивность на основе прокси. Интеграционные тесты должны подтверждать, что изменения состояния приводят к обновлению интерфейса.
instance.update({ items: ['A', 'B', 'C', 'D'] })
const listItems = document.querySelectorAll('li')
expect(listItems.length).toBe(4)
Тест охватывает:
update;Riot.js активно использует события DOM и кастомные обработчики. Интеграционные тесты проверяют сценарии взаимодействия:
const button = document.querySelector('button')
button.click()
expect(document.querySelector('.counter').textContent).toBe('1')
В этом случае тест затрагивает:
onclick;Типичный интеграционный сценарий — проверка передачи данных вниз и событий вверх:
<parent-tag>
<child-tag value={state.count} onIncrem ent={increment} />
</parent-tag>
Тест проверяет целостность цепочки:
const childButton = document.querySelector('child-tag button')
childButton.click()
expect(document.querySelector('.parent-count').textContent).toBe('1')
Здесь одновременно тестируются:
При использовании глобального состояния или кастомных сторов важно проверять не сам стор, а его влияние на компоненты:
store.setState({ user: { name: 'Alex' } })
expect(document.querySelector('.username').textContent).toBe('Alex')
Такой тест подтверждает:
Интеграционные тесты часто включают асинхронную логику: загрузку данных, таймеры, промисы.
await instance.loadData()
await Promise.resolve() // ожидание обновления DOM
expect(document.querySelector('.status').textContent).toBe('Готово')
Важно учитывать:
Несмотря на охват нескольких модулей, интеграционные тесты должны быть предсказуемыми:
jest.useFakeTimers.Это позволяет тестировать именно связность системы, а не внешнюю инфраструктуру.
Хороший интеграционный тест в Riot.js:
Интеграционное тестирование в Riot.js служит связующим звеном между модульными тестами и e2e-проверками, обеспечивая уверенность в том, что компоненты корректно взаимодействуют в реальной среде приложения.