The
TypeError: "Невозможно прочитать свойство 'fetchCompanies' из неопределенного"
вызвано тем, как вы определяете сервис CompanyService
. В коде вы экспортируете объект CompanyService
со всеми сервисными методами. Но в вашем тесте вы издеваетесь над CompanyService
, чтобы вернуть объект методами.
Итак, макет должен вернуть CompanyService
объект, который является объектом со всеми методами:
jest.mock('../../services/CompanyService', () => {
const companiesUnsorted = [
{
ticker: 'MSFT',
name: 'Microsoft Corporation'
},
...
];
return {
CompanyService: {
fetchCompanies: () => companiesUnsorted
}
};
});
Теперь, как только вы решите это, вы обнаружите, что у вас больше нет TypeError
, но ваш тест не проходит. Это потому, что код, который вы пытаетесь протестировать, является асинхронным, а ваш тест - нет. Итак, сразу после рендеринга ваш хук (через renderHook
) result.current.companies
станет пустым массивом.
Вам придется подождать, пока ваше обещание не будет решено. К счастью, react-hooks-testing-library
предоставляет нам waitForNextUpdate
функцию для ожидания следующего обновления ловушки. Итак, окончательный код теста будет выглядеть так:
it('returns a sorted list of companies', async () => {
const { result, waitForNextUpdate } = renderHook(() => useCompanyList());
expect(result.current.loading).toBe(true);
expect(result.current.error).toBeUndefined();
expect(result.current.companies).toEqual([]);
await waitForNextUpdate();
expect(result.current.loading).toBe(false);
expect(result.current.error).toBeUndefined();
expect(result.current.companies).toEqual(companiesSorted);
});