TL;DR

如何使用 proxyquire 替换 express.Router() 中的函数调用 sinon.stub()


我有一个expressJS服务器

import express from 'express'
import serverIndex from './server/index'

const app = express()

app.set('port', (process.env.PORT || 3001))

app.use((req, res, next) => {
  serverIndex(req, res, next)
})

app.listen(app.get('port'), () => {
  logger.info(`Find the server at: http://localhost:${app.get('port')}/`) // eslint-disable-line no-console
})

module.exports = app

我将路由分成了一个自己的文件:

import express from 'express'
import {
  externalFunction
} from './serverHelper'

const router = express.Router()

router.get(`${publicPath}/api/callMe`, (req, res) => {
  externalFunction()
    .then(response => res.send(response))
    .catch(error => res.status(400).send({ error: error.message }))
})

export default router

现在我想测试服务器在调用函数时返回正确的HTTP状态和正文 . 我已经测试了 serverHelper ,现在我只是想确保在进行集成测试之前我还覆盖了所有路由并且单元测试正在运行 .

我的问题是我无法使用proxyquire和sinon快速处理使用存根响应替换对 serverHelper 的调用

import sinon from 'sinon'
import request from 'supertest'
import proxyquire from 'proxyquire'

describe('server unit Test', () => {
  it('should do test', async () => {
    const proxyquireStrict = proxyquire.noCallThru()
    const stubbed = proxyquireStrict('../../../server', {
      './server/index': {
          externalFunction: sinon.stub().resolves({ message: 'Wohoo' })
        }
    })

    const response = await request(stubbed).get('/api/callMe')
    console.log(response)
  })
})

这与 TypeError: (0 , _index2.default) is not a function 一直失败