У меня есть тестовый класс Jest с двумя тестами, которые оба проходят нормально.Моя проблема в том, что когда я запускаю yarn run test
, мои тесты выполняются, но Jest зависает.Покопавшись в Интернете, я обнаружил, что многие люди говорят о том, что они не обрабатывают async / await правильно, но, исходя из всего, что я вижу в документах Jest, моя реализация верна.Я также попытался запустить тесты с флагом --detectOpenHandles, но он не дает мне никакой информации.Последнее сообщение, которое я получаю в своей консоли: «Запустил все тестовые наборы».но он просто зависает после этого и никогда не закрывает процесс тестирования.Если я использую флаг --forceExit, то закрывается нормально, но я не хочу использовать это.Как я могу сдать мои тесты?
Это мой тестовый класс:
describe('urlShortener middleware', () => {
const LONG_URL = "www.google.com";
const SHORT_URL = "www.g.com";
let shortenUrl;
const req = {
body: {
url: LONG_URL
}
};
const res = { end: jest.fn(), json: jest.fn(), status: jest.fn().mockReturnThis() };
const mockResponse = {
body: {
"short_url": SHORT_URL
},
status: 201
};
let axiosMock = {
post: jest.fn().mockResolvedValue(mockResponse)
};
beforeEach(() => {
req.body = {url: LONG_URL};
jest.setMock('axios', axiosMock);
shortenUrl = require('../urlShortener').default;
res.end.mockReset();
res.json.mockReset();
res.status.mockReset();
res.status.mockReturnValue(res);
});
it('should return the data appropriately when nothing goes wrong', async (done) => {
await shortenUrl(req, res);
expect(axiosMock.post.mock.calls[0][1].original_url).toBe(LONG_URL);
expect(res.status).toHaveBeenCalledTimes(1);
expect(res.status).toHaveBeenCalledWith(201);
expect(res.json).toHaveBeenCalledWith({ shortUrl: SHORT_URL });
done();
});
it('should set the correct status when the world burns', async (done) => {
axiosMock.post = jest.fn().mockRejectedValue(new Error());
await shortenUrl(req, res);
expect(res.status).toHaveBeenCalledTimes(1);
expect(res.status).toHaveBeenCalledWith(500);
expect(res.json).toHaveBeenCalledTimes(1);
done();
});
});