如何在 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 测试中,效果很好,但在测试中,它不起作用,不知道为什么。
因此,对于遇到过类似问题的人,请检查调试器或任何其他内置服务器的默认端口。
我已经阅读了很多类似问题的答案,但无法弄清楚我的代码中有什么问题。
这是我的 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 测试中,效果很好,但在测试中,它不起作用,不知道为什么。
因此,对于遇到过类似问题的人,请检查调试器或任何其他内置服务器的默认端口。