0

我想使用 node-mocks-http 用 Jest 测试我的 Next.js API 函数。这是我要测试的功能:

export default async (
  req: NextApiRequest,
  res: NextApiResponse
): Promise<void> => {
  const foods = await getFoods()
  res.json(foods)
}

这是我的测试文件的样子:

import { createMocks } from 'node-mocks-http'
import handler from './foods'

  test('api route', async (done) => {
    try{
      const { req, res } = createMocks({
        method: 'GET',
      })
      await handler(req, res)
      expect(res._getStatusCode()).toBe(200)
      done()
    } catch(err){
      done(err)
    }
  })

没有await getFoods()调用,一切都按预期工作。但是,通过调用我得到错误:Jest did not exit one second after the test run has completed.getFoods()是一个异步棱镜数据库查询。这里缺少什么?

4

3 回答 3

0

如果我将它添加到我的测试文件中,这个警告就会消失:

afterAll(async () => {
  await prisma.$disconnect()
})
于 2021-06-17T06:35:13.007 回答
0

也不要混合done()和异步代码,你不需要块,如果函数拒绝catch,测试将失败。async

import { createMocks } from 'node-mocks-http'
import handler from './foods'

  test('api route', async () => {
      const { req, res } = createMocks({
        method: 'GET',
      })

      await handler(req, res)

      expect(res._getStatusCode()).toBe(200)
  })
于 2021-06-16T10:48:12.953 回答
0

似乎您有同步问题,因此您应该检查https://jestjs.io/es-ES/docs/25.x/tutorial-async并且总是有典型的计时器解决方案以防您的处理程序功能无法正常工作可以尝试这样的事情

test('api route', async (done) => {
try{
  const { req, res } = createMocks({
    method: 'GET',
  })
  await handler(req, res)
  setTimeout(() => {
    expect(res._getStatusCode()).toBe(200)
    done()
  }, 1000);
} catch(err){
  done(err)
}

})

于 2021-06-16T17:04:45.713 回答