Как объединить сложные селекторы

#react-testing-library

#react-testing-library

Вопрос:

Мы столкнулись с более сложным пользовательским интерфейсом, который хотим протестировать:

 # Section Header A

 - Option 1
   [ ] checkbox
 - Option 2
   [ ] checkbox

# Section Header B

 - Option 1
   [ ] checkbox
  

Я хочу найти флажок в опции 1 заголовка раздела A или в псевдокоде:

 chain(
  getByRole('fieldset', {name: 'Section Header A'}),
  getByText('Option 1'),
  getByRole('checkbox')
)
  

В настоящее время мы решили эту проблему с помощью:

 import {
  getByText as globalGetByText,
  getByRole as globalGetByRole,
} from '@testing-library/dom';

const { container } = render(<MyComponent />);
const sectionA = globalGetByRole(container, 'fieldset', {name: 'Section Header A'}),
const option1 = globalGetByText(sectionA, 'Option 1'),
const finallyMyElement = globalGetByRole(option1, 'checkbox')
  

Обратите внимание на глобальное … переименование импорта, чтобы избежать столкновений с обычными запросами GetBy * и явной передачей ссылки на контейнер.

Мы не используем testids, в соответствии с духом react-testing-library.

Есть ли более интуитивно понятный способ?

Ответ №1:

Кажется within() , это решает мою проблему (https://testing-library.com/docs/dom-testing-library/api-within ):

 const { getByRole } = render(<MyComponent />);
const sectionA = getByRole('fieldset', {name: 'Section Header A'});
const option1 = within(sectionA).getByText('Option 1');
const finallyMyElement = within(option1).getByRole('checkbox');
  

Имейте в виду, это непроверено.