【问题标题】:How to run Koa server before Tests in Mocha?如何在 Mocha 测试之前运行 Koa 服务器?
【发布时间】:2021-11-21 19:47:02
【问题描述】:

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

这是我的 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')
})

这是我的摩卡测试文件

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 响应,因为我知道测试是在服务器开始运行之前执行的......?我怎样才能让它工作?

【问题讨论】:

    标签: node.js mocha.js chai koa


    【解决方案1】:

    首先,我会将启动 (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();
                    });
            })
        });
     });
    
    

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

    代码 sn-ps 不是 testet,但我希望你明白。

    【讨论】:

    • 感谢您的建议,但它也不起作用。最奇怪的是我与我的 2 位朋友分享了我最初在此处发布的代码,并且测试对他们来说效果很好。我开始认为这可能是我的笔记本电脑的一些本地问题。但是,我不知道什么是错的,我应该检查什么......谷歌并没有真正的帮助:)
    【解决方案2】:

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

    之后我在另一台笔记本电脑上对其进行了测试,测试结果也一样。

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

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

    因此,对于那些曾经遇到类似情况的人,请检查调试器或任何其他内置服务器的默认端口。

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 2018-01-14
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 2016-12-25
      • 2019-09-28
      相关资源
      最近更新 更多