如何在 Mocha 测试之前 运行 Koa 服务器?

How to run Koa server before Tests in Mocha?

我已经阅读了很多类似问题的答案,但无法弄清楚我的代码中有什么问题。

这是我的 server.js 文件

const Koa = require('koa')
const Router = require('koa-router')

const app = new Koa()

app.use(require('koa-bodyparser')())

const login = (ctx, next) => {
  ctx.body = ctx.request.body
}

const router = new Router({ prefix: '/api' })

router.get('/test', (ctx, next) => {
  ctx.body = { resp: 'GET REQUEST /test WORKING' }
})
router.post('/login', login)

app.use(router.routes())

module.exports = app

这是我的 index.js 文件

const server = require('./server')

server.listen(3000, () => {
  console.log('App is running on http://localhost:3000')
})

这是我的 mocha 测试文件

const axios = require('axios').default
const expect = require('chai').expect
const app = require('./server')

describe('7-module-3-task', () => {
  describe('test', function () {
    let server

    before(done => {
      server = app.listen(3000, done)
    })

    after(async () => {
      server.close()
    })

    it('should return response from server', async () => {

      const response = await axios.get('http://localhost:3000/api/test')

      expect(response.data, 'should return object with key "resp').to.have.property('resp')
    })
  })
})

当我在 Postman 中发出请求时,它工作正常。我已经尝试了多个选项,但我仍然收到 404 响应,据我所知,测试是在服务器启动之前执行的 运行...?我怎样才能让它工作?

首先,我会将启动项 (app.listen) 直接移至 server.js(并不重要,但可能更简单,因为您测试中的 require 将已经启动您的服务器:

const Koa = require('koa')
const Router = require('koa-router')

const app = new Koa()

app.use(require('koa-bodyparser')())

const router = new Router({ prefix: '/api' })

router.get('/test', (ctx, next) => {
  ctx.body = { resp: 'GET REQUEST /test WORKING' }
})

app.use(router.routes())

app.listen(3000); // can be a parameter but for simplicity hardcoded here

module.exports = app

在你的测试中你会做:

let chai = require('chai');
let chaiHttp = require('chai-http');
let server = require('./server'); // this will already start up your server

describe('API Tests', () => {
    describe('TEST endpoint', () => {
        it('It should GET response from test endpoint', (done) => {
            chai.request('http://localhost:3000')
                .get('/api/test/')          // be sure to have a trailing '/' !!
                .end((err, res) => {
                    res.body.should.have.property('resp');
                    done();
                });
        })
    });
 });

另一个提示:也许在您的原始代码中,您只需要确保在测试中调用您的路由时有尾随 /

代码片段未经过测试,但希望您能理解。

我与我的 2 个朋友分享了相同的代码,他们设法 运行 测试成功。

之后我在我的另一台笔记本电脑上测试了它,测试也正常。

问题出在端口上。 3000 端口在 Webstorm 的调试器中被用作默认端口,不知道为什么但仍然如此。

以常规方式在端口 3000 上启动服务器,而不是在 mocha 测试中,效果很好,但在测试中,它不起作用,不知道为什么。

因此,对于遇到过类似问题的人,请检查调试器或任何其他内置服务器的默认端口。