Dzień dobry, pierwszy raz szukam odpowiedzi odnośnie programowania ale tutaj już poległem, przekopałem co się dało na zagranicznych stronach, dokumentacje, przepytałem chatGPT (ale to debil) i może tutaj znajdę odpowiedź. Otóż robię prostą aplikację w React, póki co tylko sprawdzam wszystkie ustawienia, dodałem React Router, działa bez zarzutu, problem mam natomiast z napisaniem testów, które sprawdzały by przejście użytkownika z jednej podstrony do innej. Plik z testem wygląda tak:
import { describe, it, expect } from 'vitest';
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { fireEvent } from '@testing-library/dom';
import Context from './Context';
import { RouterProvider, createMemoryRouter } from 'react-router-dom';
import { routes } from './Router';
describe('App component', () => {
it('renders App', async () => {
const router = createMemoryRouter(routes, { initialEntries: ['/login'] });
render(
<Context>
<RouterProvider router={router} />
</Context>
);
const btn = screen.getByText('Go back to main page');
expect(btn).toBeVisible();
userEvent.click(btn);
await waitFor(() => {
expect(window.location.pathname).toBe('/');
expect(btn).toBeVisible();
});
screen.debug();
});
});
I teraz - router wczytał się poprawnie - tzn, jeżeli manualnie ustawię initialEntries na stronę głowną "/" to testuje stronę głowną, jak podstronę to podstronę, zwykłe testy działają bez zarzutu. Ale jeżeli użytkownik klika 'userEvent.click(btn)' i powinien się przenieśc na strone głowną, to po użyciu 'screen.debug()' nic się nie zmienia, zostaje wcześniejsza strona. Żeby było zabawniej w tym teście:
await waitFor(() => {
expect(window.location.pathname).toBe('/');
expect(btn).toBeVisible();
});
oba testy przechodzą, tzn ścieżka zostaje poprawnie zaktualizowana, ale wyświetlana jest dalej 'stara' strona ze wcześniejszej ścieżki (na stronie głownej nie było by tego przycisku).
Intuicyjnie problem mogłby leżeć w asynchroniczności, tzn że event wykonuje się poprawnie, tylko nowa strona nie zdążyła się jeszcze wyrenderować więc wyświetla starą, ale kombinowałem z czym sie da tzn. wstawianiem await, używaniem funkcji waitFor, setTimeOut itp i tak czy owak nie udało mi się uzyskać pożądanego efektu.
Jak ktoś ma jakieś pomysły to będę wdzięczny, mam nadzieję że napisałem to we wmiarę czytelny sposób.
Pozdrawiam