Тесты Jest пройдены в обещаниях, но не выполнены в async / await - PullRequest
0 голосов
/ 11 июня 2018

Я пишу тесты на своем RESTful API, используя Jest + supertest.Мой test.js поначалу выглядел так:

const crypto = require('crypto')
const request = require('supertest')
const app = require('./app')

const genUUID = () => {
  return ([1e7]+1e3+4e3+8e3+1e11).replace(/[018]/g, c =>
    (c ^ crypto.randomFillSync(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  )
}

let uuid1 = genUUID()
let uuid2 = genUUID()


describe('Test /uuids', () => {
  it('Get list of uuids', () => {
    request(app).get('/api/uuids/').then(res =>
      expect(res.statusCode).toBe(200)
    )
  })
})

describe('Test /uuids/:uuid', () => {
  it('Get info of a not-existed product', () => {
    request(app).get('/api/uuids/' + uuid1).then(res =>
      expect(res.statusCode).toBe(400)
    )
  })
})

Он работает и все тесты пройдены.

Но мне нравится стиль async / await, поэтому я переключил обещания на async/await.

... // The previous part remains unchanged
describe('Test /uuids', () => {
  it('Get list of uuids', async() => {
    const res = await request(app).get('/api/uuids/')
    expect(res.statusCode).toBe(200)
  })
})

describe('Test /uuids/:uuid', () => {
  it('Get info of a not-existed product', async () => {
    const res = await request(app).get('/api/uuids/' + uuid1)
    expect(res.statusCode).toBe(400)
  })
})

На этот раз возникают ошибки.

console.error api/uuids.js:247
    ERR!error: bind message supplies 1 parameters, but prepared statement "Get lists of UUIDs" requires 6
    ....

 ● Test /uuids/:uuid › Get info of a not-existed product

    Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

Правильно ли я написал асинхронное / ожидание?Или были какие-то проблемы с асинхронным ожиданием в Jest?

PS node версия v8.11.2

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Попробуйте увеличить предел времени ожидания (передав число в миллисекундах в качестве второго аргумента функции it):

describe('Test /uuids', () => {
  it('Get list of uuids', async() => {
    const res = await request(app).get('/api/uuids/')
    expect(res.statusCode).toBe(200)
  }, 30000)
})

describe('Test /uuids/:uuid', () => {
  it('Get info of a not-existed product', async () => {
    const res = await request(app).get('/api/uuids/' + uuid1)
    expect(res.statusCode).toBe(400)
  }, 30000)
})
0 голосов
/ 12 июня 2018

Версия с обещаниями на самом деле не работает.Как сказано в комментариях ( это и это ), результаты тестов пропускаются, что дает ложный смысл прохождения тестов.Добавление return к обещанию приводит к тем же ошибкам, что и случай async / await.

Путем насмешливости кода приложения с помощью

const app = new (require('express'))()

app.get('/api/uuids', (req, res) => {
  res.status(200).end()
})

app.get('/api/uuids/:uuid', (req, res) => {
  res.status(200).end()
})

module.exports = app

Асинхронизация / ожидание показывает, что это неправильнов GET /api/uuids/:uuid, в то время как обещания все еще сообщают, что все тесты пройдены.Так что вместо этого асинхронный / ожидающий верен.

И после некоторой отладки выясняется, что это проблема моего кода при запросе к базе данных, поэтому сначала возникла ошибка postgres.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...