使用mocha / chai / sinon进行单元测试Express-如何测试重新发送对象的形状?

时间:2019-06-06 06:29:50

标签: node.js express mocha chai sinon

我正在对导致API响应的各个组件进行单元测试,换句话说,由于每条路由都通过该组件,因此我独立于一条路由对其进行测试

我需要测试负责发送我的快速响应的函数的形状正确,但是如果没有发送实际的HTTP请求,我将不知道如何进行测试。

这是我的组成部分

'use strict'

const moment = require('moment')
module.exports = (req, res, payload) => {
  try {
    let data = []
    if (payload.token) data.push({ token: payload.token })
    data.push({ [payload.resource]: payload.data })
    res.send({
      status: 'OK',
      recordCount: payload.data.length,
      startTimestamp: req.start.toDate(),
      endTimestamp: moment().toDate(),
      timeTaken: moment().toDate().getTime() - req.start.toDate().getTime(),
      data: data
    })
  } catch (error) {
    return res.status(500).json({
      errors: [{
        location: 'n/a',
        param: 'n/a',
        msg: 'something happened when generating the response'
      }]
    })
  }
}

这是我目前的考试...

const chai = require('chai')
const sinonChai = require('sinon-chai')
const { mockReq, mockRes } = require('sinon-express-mock')
const moment = require('moment')
const present = require('../../src/lib/present')

chai.use(sinonChai)

describe('unit test the present lib method', () => {
  it('should return the expected shape', (done) => {
    const req = mockReq({
      start: moment().toDate(),
      body: {}
    })
    const res = mockRes()
    const shape = present(req, res, {
      resource: 'empty_array',
      data: []
    })
    shape.should.have.own.property('data') // doesnt work
    // AssertionError: expected { Object (append, attachement, ...) } to have own property 'data'
    done()
  })
})

1 个答案:

答案 0 :(得分:0)

要正确测试响应模式,您需要进行E2E测试,这需要您发送API调用。

如果您只想测试路由内部的逻辑,则可以始终将其提取到某些服务中,然后仅测试该服务。

您可以阅读以下文章:https://www.freecodecamp.org/news/how-to-mock-requests-for-unit-testing-in-node-bb5d7865814a/