Не проходят unit тесты. (Jest, JS)
У меня есть функция. Она находит css-селектор в HTML документе и показывает путь к нему.
function getPath(element) {
const path = [];
while (element.nodeType === 1) {
let selector = element.nodeName.toLowerCase();
if(selector === 'html') {
break;
}
if (element.id) {
selector += `#${element.id}`;
path.unshift(selector);
break;
} else if(element.className) {
selector += `.${element.className}`;
} else {
let sib = element, nth = 1;
while (sib === sib.previousElementSibling) {
if (sib.nodeName.toLowerCase() === selector)
nth++;
}
if (nth !== 1)
selector += ":nth-of-type("+nth+")";
}
path.unshift(selector);
element = element.parentNode;
}
return path.join(" --> ");
}
module.exports = getPath;
Пример использования:
HTML документ
<div class="container">
<div class="row">
<nav class="main-nav">
<ul class="nav-main__list">
<li class="nav-main__item"><a href="#promo_link">О компании</a></li>
<li class="nav-main__item"><a href="#team_link">Команда</a></li>
<li class="nav-main__item"><a href="#contact_link">Контакты</a></li>
</ul>
</nav>
</div>
</div>
Проверка
console.log(`${getPath(document.querySelector('.nav-main__item'))}`);
Результат
div.container --> div.row --> nav.main-nav --> ul.nav-main__list --> li.nav-main__item
Суть проблемы:
Unit тесты на jest
const getPath = require('./getPath')
test('getPath returns correct path for element with id', () => {
const element = document.createElement('div');
element.id = 'test';
const path = getPath(element);
expect(path).toBe('div#test');
});
test('getPath returns correct path for element with class', () => {
const element = document.createElement('div');
element.className = 'test';
const path = getPath(element);
expect(path).toBe('div.test');
});
test('getPath returns correct path for element with nth-of-type', () => {
const parent = document.createElement('div');
const element1 = document.createElement('span');
parent.appendChild(element1);
const element2 = document.createElement('div');
parent.appendChild(element2);
const element3 = document.createElement('div');
parent.appendChild(element3);
const path = getPath(element2);
expect(path).toBe('div:nth-of-type(2)');
});
test('getPath returns correct path for nested element', () => {
const parent = document.createElement('div');
const child = document.createElement('span');
parent.appendChild(child);
const path = getPath(child);
expect(path).toBe('span');
});
test('getPath returns correct path for top-level element', () => {
const element = document.createElement('html');
const path = getPath(element);
expect(path).toBe('html');
});
test('getPath returns correct path for non-element node', () => {
const textNode = document.createTextNode('test');
const path = getPath(textNode);
expect(path).toBe('');
});
√ getPath returns correct path for element with id
× getPath returns correct path for element with class
× getPath returns correct path for element with nth-of-type
× getPath returns correct path for nested element
× getPath returns correct path for top-level element
√ getPath returns correct path for non-element node
Отрабатывает только два теста, остальные падают, помогите разобраться!
Источник: Stack Overflow на русском