chciałbym sprawdzić ilu krotnie jest wywołana funkcja po np. po 2 sekundach po wyrenderowaniu.
A dlaczego przyjąłeś założenie czasowe? Co sprawia, że po jakimś czasie funkcja getLocationsData jest wołana z komponentu? Jest tam faktycznie jakiś setTimeout, następuje reakcja na response z API, obserwujesz zmiany w DOM czy czekasz na reakcje użytkownika - jak do tego mają się te 2 sekundy? Bo może lepiej jest w teście poczekać konkretnie na to, co powoduje wywołanie funkcji, zamiast czekać określoną ilość czasu (co bywa kruche w asynchroniczności)?
Jeśli dobrze rozumiem, to funkcja getLocationsData korzysta z axiosa i sama jest używana przez komponent LocationsTable. Dlaczego najpierw (pozornie*) importujesz jej oryginał przez import getLocationsData from '../../../routes/getLocationsData' , a potem ją mockujesz jest.mock('../../../routes/getLocationsData') i korzystasz z mocka zamiast z oryginału?
*Mock tworzony przez odwołanie do jest.mock jest hoistowany (w przeciwieństwie do jest.doMock), więc jest.mock wykonuje się przed importem (z pozoru) oryginału funkcji getLocationsData - pewnie dlatego TypeScript sądzi, że to nie jest mock, bo zauważył import oryginału. Jeśli chcesz jednocześnie czytelnie zamockować moduł (dla komponentów, które korzystają z niego jako zależności) i działać na nim w teście, to zapisz w ten sposób:
const getLocationsData = jest
.mock('../../../routes/getLocationsData') // <-- mockuj dla zależności
.mockRequire('../../../routes/getLocationsData'); // <-- pobierz mocka do zmiennej
Wtedy, za jednym zamachem, komponent LocationsTable będzie korzystać z mocka (zakładając, że sam go importuje), Ty będziesz mieć mocka do użycia w teście i TypeScript powinien zauważyć, że korzystasz z mocka.
nie wiem co powinienem zmienić, żeby mockowany axios był zliczany z poziomu komponentu, a nie testu
Dlaczego potrzebujesz żeby mockowany axios był zliczany z poziomu komponentu a nie testu? I w ogóle, gdzie mockujesz axiosa?