Supertest асинхронный обратный вызов не был вызван - PullRequest
0 голосов
/ 28 ноября 2018

Я получаю следующую проблему, пытаясь протестировать минималистский пример с supertestjest):

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

Обратите внимание, что это не дублирует другие проблемы наТАК, как я понял проблему даже после значительного увеличения значения тайм-аута по умолчанию с помощью Jasmine.Я склонен полагать, что проблема может быть связана с использованием resource-router-middleware, и этот пост может быть полезен для других.

Мой полный пример:

foo.js

import resource from 'resource-router-middleware'

export default () => resource({
  id: 'foo',

  create: [
    (req, res) => {
      res.status(201).json({ 'foo': 'bar' })
    }
  ]
})

foo.test.js

import request from 'supertest'
import foo from 'foo'

jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000

test('create should return 201', () => {
  return request(foo).post('/').then(response => {
    expect(response.statusCode).toBe(201)
  })
})

Полная ошибка

FAIL  foo.test.js (61.578s)
  ✕ create should return 201 (60047ms)

  ● create should return 201

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

      4 | jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000
      5 |
    > 6 | test('create should return 201', () => {
        | ^
      7 |   return request(foo).post('/').then(response => {
      8 |     expect(response.statusCode).toBe(201)
      9 |   })

      at Spec (node_modules/jest-jasmine2/build/jasmine/Spec.js:85:20)
      at Object.test (foo.test.js:6:1)

1 Ответ

0 голосов
/ 28 ноября 2018

Похоже на отсутствие документации о том, что такое resource-router-middleware и как его следует правильно использовать.Однако из исходного кода мы можем видеть, что это router .Это означает, что мы должны указать для этого путь к маршруту.

Итак, ваш foo.js может сделать что-то вроде:

import resource from 'resource-router-middleware'
const express = require('express');

const app = express();
const mw =  resource({
  id: 'foo',

  create: [
    (req, res) => {
      res.status(201).json({ 'foo': 'bar' })
    }
  ]
})
// actual bind to our resources to '/' route
// app.post('/', mv) is fine too, but 
// if you describe more than 1 resource, it doesn't have much sense
app.all('/', mw); 
export default app;

Или, используя route.route :

mw.route('/');
app.use(mw);

Конечно, есть и другие способы привязки маршрутов, я показал только первый, который нашел.Тем не менее, общая идея моего ответа заключается в том, что - resource-router-middleware должны быть связаны с экспресс-приложением.

Надеюсь, это поможет.

...