未调用Supertest异步回调

时间:2018-11-28 11:32:20

标签: javascript jestjs supertest resource-router-middleware

通过尝试使用supertest(和jest)来测试一个极简示例,我遇到了以下问题:

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

请注意,这不是SO上其他问题的重复,因为即使使用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 :(得分:0)

似乎缺少关于resource-router-middleware是什么以及应如何正确使用它的文档。但是,从source code中我们可以看到它是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必须绑定到快速应用程序。

希望有帮助。