• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

React Testing Library: błąd funkcji findByText() - nie znajduje tekstu w liście rozwijanej (MSW, downshift-js)

Object Storage Arubacloud
0 głosów
39 wizyt
pytanie zadane 25 stycznia w JavaScript przez Bilib Użytkownik (990 p.)

Chcąc wykonać test, wyświetla się powiadomienie o błędzie:

  ● Search Bar › Displays when search phrase is matching

    Unable to find an element with the text: /element/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

    Ignored nodes: comments, script, style
    <body>
      <div />
      <div
        aria-live="polite"
        aria-relevant="additions text"
        id="a11y-status-message"
        role="status"
        style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: absolute; width: 1px;"
      />
    </body>

      22 |     const input = screen.getByPlaceholderText('Search');
      23 |     fireEvent.change(input, { target: { value: 'el' } });
    > 24 |     await screen.findByText(/element/);
         |                  ^
      25 |   });

      at waitForWrapper (node_modules/@testing-library/dom/dist/wait-for.js:163:27)
      at findByText (node_modules/@testing-library/dom/dist/query-helpers.js:86:33)
      at Object.<anonymous> (src/components/organisms/SearchBar/SearchBar.test.js:24:18)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 passed, 2 total
Snapshots:   0 total
Time:        2.692 s
Ran all test suites related to changed files.

Watch Usage: Press w to show more.

Oto test:

import { render, screen, fireEvent } from 'test-utils';
import { SearchBar } from './SearchBar';
import { handlers } from 'mocks/handlers';
import { setupServer } from 'msw/node';

export const server = setupServer(...handlers);

describe('Search Bar', () => {
  beforeAll(() => server.listen());
  afterEach(() => server.resetHandlers());
  afterAll(() => server.close());  

  it('Displays when search phrase is matching', async () => {
    render(<SearchBar />);
    const input = screen.getByPlaceholderText('Search');
    fireEvent.change(input, { target: { value: 'ad' } });
    await screen.findByText(/Adam Romański/);
  });
});

Oraz komponent, do którego odwołuję się w teście:

import { Input } from 'components/atoms/Input/Input.styles';
import React, { useState } from 'react';
import debounce from 'lodash.debounce';
import {
  SearchBarWrapper,
  SearchResults,
  SearchResultsItem,
  SearchWrapper,
} from 'components/organisms/SearchBar/SearchBar.styles';
import { useElements } from 'hooks/useElements';
import { useCombobox } from 'downshift';

export const SearchBar = () => {
  const [matchingElements, setMatchingElements] = useState([]);
  const { findElements } = useElements();

  const getMatchingStudents = debounce(async ({ inputValue }) => {
    const elements = await findElements(inputValue);
    setMatchingElements(elements);
  }, 500);

  const {
    isOpen,
    getMenuProps,
    getInputProps,
    getComboboxProps,
    highlightedIndex,
    getItemProps,
  } = useCombobox({
    items: matchingElements,
    onInputValueChange: getMatchingElements,
  });

  return (
    <SearchBarWrapper>
      <SearchWrapper {...getComboboxProps}>
        <Input
          {...getInputProps()}
          name="Search"
          id="Search"
          placeholder="Search"
        />
        <SearchResults
          $isVisible={isOpen && matchingElements.length > 0}
          {...getMenuProps()}
        >
          {isOpen &&
            matchingElements.map((item, index) => (
              <SearchResultsItem
                $isHighlighted={highlightedIndex === index}
                {...getItemProps({ item, index })}
                key={item.id}
              >
                {item.name}
              </SearchResultsItem>
            ))}
        </SearchResults>
      </SearchWrapper>
    </SearchBarWrapper>
  );
};

Sama aplikacja działa prawidłowo - wpisując w Input łańcuch 'el', prawidłowo wyświetla się pod polem tekstowym lista rozwijana wraz z wyszukiwanym elementem 'element'. Lista prawidłowo znika, gdy Input jest pusty lub kliknę gdzieś poza pole wyszukiwania, pojawia się prawidłowo gdy kliknę ponownie w niepusty Input. Konsola przeglądarkowa (F12) nie wyświetla błędów.

Test sprawia wrażenie, jakby nie było żadnego rezultatu po wykonaniu fireEvent.change(input, { target: { value: 'el' } }); - tak jakby w SearchResults (ul) nie było żadnego elementu SearchResultsItem (li), jedynie Input otrzymuje wartość 'el', a lista w ogóle się "nie rozwija".

Nie działają sztuczki w postaci: wprowadzania funkcji expect()toBeInTheDocument(), toBeVisible(), toBeTruthy(), waitFor(); nadania labelów do komponentów (SearchResultsSearchResultsItem) ; importów TextEncoder, TextDecoder itd. itd. itd. Zastanawiałem się nad reinstalacją do starszych wersji Testing Library lub Mock Service Worker, choć wolałbym tego uniknąć.

Co mam naprawić, aby test przeszedł?

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 144 wizyt
+1 głos
0 odpowiedzi 212 wizyt
pytanie zadane 10 marca 2021 w JavaScript przez poldeeek Mądrala (5,980 p.)
0 głosów
0 odpowiedzi 70 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...