测试expressJS的基本中间件

时间:2017-11-22 07:45:52

标签: javascript express integration-testing

有一个非常基本的中间件,我想测试一下。

第一个问题是我正在使用什么样的测试。根据我的理解,我无法为此代码编写单元测试。 我称之为集成测试。这是对的吗?

第二个问题是测试本身:我遇到了超时,但我已经使用了done()。 我究竟做错了什么?这是测试这个中间件的正确方法吗?

/middlewares/graphql.js

module.exports = (req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*')
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With')
  if (req.is('application/graphql')) {
    req.body = { query: req.body }
  }
  if (req.method === 'OPTIONS') {
    res.sendStatus(200)
  } else {
    next()
  }
}

/tests/middlewares/graphql.js

import nodeMocks from 'node-mocks-http'
import middleware from '../middlewares/graphql'

describe('GraphQL middleware', () => {
  it('Should return 200 for valid Content-Type header', (done) => {
    const req = nodeMocks.createRequest({
      headers: {
        'Content-Type': 'application/graphql'
      },
      body: {
        content: 'anything'
      },
      method: 'OPTIONS'
    })
    const res = nodeMocks.createResponse()
    middleware(req, res, (err) => {
      expect(res.statusCode).toEqual(200)
      expect(res.body.content).toEqual('anything')
      expect(err).toBeNull()
      done()
    })
  })
})

1 个答案:

答案 0 :(得分:1)

middleware是一个以(req, res, next)为参数的函数。您发送reqres以及处理断言的回调。即断言测试以next()传递。

但是当你传递next()作为请求方法时,没有理由调用OPTIONS。然后,中间件将执行res.sendStatus(200)。因此,您必须将中间件称为普通函数(对于此特定测试)。

middleware(req, res);

expect(res.statusCode).to.equal(200);
expect(res.body.content).to.equal('anything');
done();

除了res.body之外,它会失败,但那是因为中间件函数是这样编写的。

只要您只测试中间件功能,我就称之为单元测试。如果您关心next()被调用后会发生什么,我会称之为集成测试。但是,只要它经过测试,它所称的并不重要。

当中间件必须调用next()时,您可以看到this答案进行测试。