Не проходят unit тесты. (Jest, JS)

Рейтинг: 0Ответов: 0Опубликовано: 25.04.2023

У меня есть функция. Она находит 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

Отрабатывает только два теста, остальные падают, помогите разобраться!

Ответы

Ответов пока нет.