У меня есть функция вызова API, которая извлекает данные из моей серверной части для отображения. Мой вызов API в качестве заголовка, необходимого для авторизации при получении данных. Хранилище сеанса устанавливается при входе в систему при запуске приложения.
Мой основной код таков:
AdminTable.js
export const ADMIN_URL = '/admin_management/list/';
export const fetchAdmin = async () => {
try {
const response = await axios.post(
ADMIN_URL,
{},
{
headers: { Authorization: `Bearer ${sessionStorage.getItem('access_token')}` },
}
);
return response.data.results;
} catch (err) {
console.info(`Error: ${err.message}`);
}
};
И мой тестовый код:
AdminTable.test.js
import { fetchAdmin } from '../pages/AdminTable';
import axios from '../api/axios';
jest.mock('../api/axios', () => ({
post: jest.fn(),
}));
axios.post.mockResolvedValue({ data: { results: 'Mock Jedi' } });
describe('fetchAdmin', () => {
afterEach(jest.clearAllMocks);
it('return correct data', async () => {
const result = await fetchAdmin();
expect(result).toMatch('Mock Jedi');
expect(axios.post).toHaveBeenCalledTimes(1);
});
});
Когда я запускаю тест, я получаю эту ошибку:
Expected substring: "Mock Jedi"
Received string: "sessionStorage is not defined"
> 19 | expect(result).toMatch('Mock Jedi');
| ^
20 | expect(axios.post).toHaveBeenCalledTimes(1);
21 | });
22 | });
Как мне издеваться над шуткой, чтобы вставить токен для sessionStorage
?
Если я удалю заголовки или установлю Bearer ${'123123'}
в AdminTable.js
файле, тест не будет иметь проблем.
Я нашел решение! Проблема в том, что sessionStorage доступен только при работе в браузере. Все, что мне нужно, это издеваться над sessionStorage в моем тестовом файле. Вы делаете это:
global.sessionStorage = {
getItem: jest.fn(() => 'test token'),
};