Я пытаюсь инкапсулировать некоторый общий код установки/разборки в такую функцию:
export function testWithModalLifecycle() {
beforeEach(() => {
const modalRootDom = document.createElement('div')
modalRootDom.id = ModalRootDomId
document.appendChild(modalRootDom)
})
afterEach(() => {
const modalRootDom = document.getElementById(ModalRootDomId)
if (modalRootDom) {
modalRootDom.remove()
}
})
}
И использовать это в тестах, где мне это нужно:
describe('Modal', () => {
testWithModalLifecycle()
it('should render a modal', () => {
//...
})
})
Но похоже, что мой код установки/разборки никогда не вызывается. Я делаю что-то неправильно? Это возможно как-то?
Is this possible somehow?
Да, это возможно.
Ваша функция просто должна вызывать beforeEach
и afterEach
синхронно в теле функции, как вы делаете, и функция должна вызываться синхронно в теле обратного вызова describe
, что вы также делаете.
Я настроил тест и столкнулся с ошибкой с document.appendChild
, но если эту строку изменить на document.body.appendChild
, то все работает нормально:
util.js
export const ModalRootDomId = 'myid';
export function testWithModalLifecycle() {
beforeEach(() => {
const modalRootDom = document.createElement('div');
modalRootDom.id = ModalRootDomId;
document.body.appendChild(modalRootDom); // <= append to the body
});
afterEach(() => {
const modalRootDom = document.getElementById(ModalRootDomId);
if (modalRootDom) {
modalRootDom.remove();
}
});
}
код.test.js
import { testWithModalLifecycle, ModalRootDomId } from './util';
describe('Modal', () => {
testWithModalLifecycle()
it('should render a modal', () => {
const modalRootDom = document.getElementById(ModalRootDomId);
expect(modalRootDom.outerHTML).toBe('<div id = "myid"></div>'); // Success!
})
})
Ура, похоже, эти хуки все-таки были названы, я просто неправильно манипулировал домом:
document.body.appendChild(modalRootDom)