В контексте разработки на FAST Element моки и стабы играют ключевую роль при тестировании компонентов. Они позволяют изолировать логику компонента, имитировать внешние зависимости и контролировать поведение без реального взаимодействия с DOM или API.
Пример: если компонент запрашивает данные с сервера, стаб может просто возвращать фиктивный объект, а мок позволит проверить, что метод запроса был вызван с правильными параметрами.
FAST Element строится на базе Web Components,
поэтому компоненты обычно наследуют FASTElement. Для стаба
нужно изолировать зависимости компонента.
import { FASTElement, html, css } from "@microsoft/fast-element";
class UserCard extends FASTElement {
static template = html`<div>${x => x.name}</div>`;
static styles = css`div { font-weight: bold; }`;
name = '';
async fetchUser() {
const response = await fetch(`/api/user`);
this.name = await response.json().then(data => data.name);
}
}
// Создание стаба fetch
const fetchStub = async () => ({ json: async () => ({ name: 'Тестовый пользователь' }) });
const userCard = new UserCard();
userCard.fetchUser = fetchStub; // замена метода на стаб
await userCard.fetchUser();
console.log(userCard.name); // "Тестовый пользователь"
В этом примере реальный сетевой вызов заменён на стаб, который возвращает фиксированные данные.
Моки позволяют контролировать количество вызовов метода и параметры. Для компонентов FAST это особенно полезно при тестировании событий и реактивных свойств.
import { FASTElement, html } from "@microsoft/fast-element";
class CounterButton extends FASTElement {
static template = html`<button @click="${x => x.increment()}">Нажми</button>`;
count = 0;
increment() {
this.count++;
}
}
// Создание мока функции
const incrementMock = jest.fn();
const button = new CounterButton();
button.increment = incrementMock;
// Симуляция клика
button.$emit('click');
button.increment();
button.increment();
// Проверка вызовов
console.log(incrementMock.mock.calls.length); // 2
Мок фиксирует все вызовы метода
increment, позволяя убедиться в корректном поведении
компонента.
В реальных проектах часто требуется комбинация. Например, компонент отправляет данные на сервер и обновляет внутреннее состояние. Для теста можно:
const apiStub = async () => ({ status: 200 });
const updateMock = jest.fn();
component.sendData = apiStub;
component.updateUI = updateMock;
await component.sendData();
component.updateUI();
console.assert(updateMock.mock.calls.length === 1);
FAST Element использует наблюдаемые свойства, которые автоматически обновляют DOM при изменении значений. При тестировании с моками и стабами важно учитывать:
await FASTElement.nextTick().import { FASTElement, html, nextTick } from "@microsoft/fast-element";
class MessageDisplay extends FASTElement {
static template = html`<p>${x => x.message}</p>`;
message = '';
}
const messageStub = 'Привет, тест!';
const component = new MessageDisplay();
component.message = messageStub;
await nextTick(); // обновление DOM
console.log(component.shadowRoot.innerHTML.includes(messageStub)); // true
nextTick()
для синхронизации.Моки и стабы обеспечивают точное управление поведением компонентов и помогают писать надежные, предсказуемые тесты для сложных интерфейсов на FAST Element.