mount рендерить компонент повністю - з усіма дочірніми компонентами до самого низу дерева. shallowMount рендерить лише сам компонент, а всі дочірні замінює заглушками - порожніми елементами з назвою компонента:
const wrapper = shallowMount(OrderPage)
// <order-summary-stub order="[object Object]"></order-summary-stub>
// <payment-form-stub></payment-form-stub>
Аргументи за shallowMount:
- тест ізольований від дітей: зламаний
PaymentFormне валить тестOrderPage; - швидше, якщо діти важкі (графіки, редактори, власні запити).
Аргументи проти (і чому документація Vue радить mount за замовчуванням):
- тест перевіряє не те, що бачить користувач: кнопка всередині дочірнього компонента не існує, клік по ній неможливий;
- тест прив'язується до структури компонентів: перенесли розмітку в дочірній компонент - тест зламався, хоча поведінка та сама;
- багато «зелених» ізольованих тестів не гарантують, що компоненти працюють разом.
Точкові заглушки - найкращий компроміс: монтувати повністю, але замінити окремі проблемні компоненти:
const wrapper = mount(OrderPage, {
global: {
stubs: {
MapWidget: true, // важка карта - просто заглушка
RouterLink: RouterLinkStub, // без справжнього маршрутизатора
Teleport: true, // вміст телепорту рендериться на місці
PaymentForm: { template: '<div data-test="payment" />' }, // своя мінімальна версія
},
},
})
Коли заглушка доречна:
- компонент звертається до браузерних API, яких немає в jsdom (canvas, WebGL, карти);
- дочірній компонент робить власні запити, які в цьому тесті не цікаві;
- сторонні компоненти з анімаціями чи телепортами, що заважають знаходити елементи.
Перевірка, що дочірній компонент отримав правильні props - через findComponent:
expect(wrapper.findComponent(OrderSummary).props('total')).toBe(1250)
Корисно на межі з важким компонентом-заглушкою, але для решти випадків краще перевіряти результат у DOM.
Докладніше в документації: Vue Test Utils: заглушки й shallowMount