Потеряв 2 дня на этом, вот проблема и решение:
Проблема
В antd v3 раньше можно было открыть выбор, выполнив selectHtmlElement.click()
. Вы можете проверить в консоли инструментов chrome dev. В v4 это не работает.
Это означает, что RTL, использующий JSDOM под капотом, будет иметь такое же поведение. Когда вы делаете fireEvent.click(selectElement);
, ничего не происходит !
Решение
Это ставит меня на правильный путь: https://github.com/ant-design/ant-design/issues/22074
Событие, которое нужно вызвать, - это не click()
, а mouseDown()
для первого потомка выбора.
const elt = getByTestId('your-select-test-id').firstElementChild;
fireEvent.mouseDown(elt); // THIS WILL OPEN THE SELECT !
Теперь на этом этапе вы, вероятно, захотите выбрать опция из списка, но анимация продолжается, поэтому следующий код (который раньше работал в v3) также потерпит неудачу.
expect(getByText('Option from Select')).toBeVisible(); // FAILS !
У вас есть 2 варианта, используйте toBeInTheDocument()
или дождитесь окончания анимации, используя waitFor(...)
Вариант 1: быстрее, но не совсем точно, я предпочитаю использовать это для простых случаев использования, так как это делает тесты более быстрыми и синхронными
expect(getByText('Option from Select')).toBeInTheDocument(); // WORKS !
Вариант 2: медленнее, поскольку вам нужно ждать окончания анимации sh, но более точным для сложных случаев
await waitFor(() => expect(getByText('Option from Select')).toBeVisible()); // WORKS !