react-testing-библиотека получает все, а затем фильтрует для поиска элемента

#javascript #reactjs #react-testing-library

#javascript #reactjs #react-testing-library

Вопрос:

У меня есть страница, которая отображает список пользовательских checkbox файлов. Каждый из них checkbox выглядит следующим образом.

 <div
  className="checkbox"
  role="checkbox"
  onClick={onClick}
  onKeyPress={onKeyPress}
  aria-checked={getState().checked}
  tabIndex={0}
>
  {getState().checked ? (
    <span className="checkbox__icon checkbox__selected">
      <Icon src="/icons/check-box-selected.svg" alt="checkbox selected" />
    </span>
  ) : (
    <span className="checkbox__icon">
      <Icon src="/icons/check-box-empty.svg" alt="checkbox not selected" />
    </span>
  )}
  <span className="checkbox__label">{label}</span>
</div>
  

Я хотел бы иметь возможность находить конкретный checkbox во время тестирования.
checkbox Они отличаются своими метками (в настоящее время реализованы с использованием span обработчиков клавиш / щелчков).

Я хочу протестировать, когда нажимается метка, изображение должно измениться.

Допустим, пользователь нажал на checkbox1 с надписью «checkbox1», изображение должно измениться с «флажок установлен» на «флажок не установлен»

Я сталкиваюсь с проблемами при попытке получить ссылку на checkbox с определенной меткой.

Если я это сделаю getByText("checkbox1") , он вернет мне span элемент, и у меня нет ссылки на фактический checkbox , чтобы утверждать, изменилось ли изображение.

Мой обходной путь на данный момент — getAllByRole и затем filter(item => item.textContext === "checkbox1") , а затем queryByAltText .

Есть ли лучший подход для тестирования этого?

Ответ №1:

Что ж, лучшим способом, на мой взгляд, будет присвоить checkbox div идентификатор prop с меткой var и просто выполнить getElementById .

Но если вы получите диапазон, как вы говорите, вы всегда можете сделать .parentElement и получить флажок div.

Вы также можете использовать .closest("div.checkbox"); в sapn, и он будет искать ближайший div с флажком class.

Комментарии:

1. .parentElement, вероятно, сделает тест хрупким, поскольку я могу вложить диапазон дальше, ничего не меняя для пользователя.

2. Подход id или testid работает, но это мое последнее средство, поскольку я не хочу добавлять что-то только для целей тестирования

3. ну, вы можете использовать .closest(«div»); кроме того, это выдаст вам ближайший div.

4. .ближайший также был бы хрупким, легко изменить структуру компонента так, чтобы пользователь даже не увидел разницы. Я не думаю, что хотел бы, чтобы мои тесты были нарушены в этом случае.