我有一个Jest测试类,其中有2个测试都通过了。我的问题是,当我运行yarn run test
时,我的测试会执行,但Jest会挂起。在网上闲逛之后,我发现很多人都在谈论不能正确处理异步/等待,但是基于我在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();
});
});