我有一个express API,我正在开发,并且正在尝试使用该项目来学习所有express的最佳实践。这就是说我想为我的终端编写单元测试。我一直在试图弄清楚如何运行我的开发服务器以及在手表模式下运行我的摩卡测试。这个问题是,因为mocha
和nodemon
正试图重新启动/同时运行,我会在我的测试中得到不同的结果,而这种结果会在手表模式下失败。在watch模式冲突时使用nodemon和mocha测试Express端点
我将多种以下错误:
1) GET /user/:userId Status Code 200:
Uncaught Error: connect ECONNREFUSED 127.0.0.1:3000
at Object.exports._errnoException (util.js:1050:11)
at exports._exceptionWithHostPort (util.js:1073:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)
1) GET /user/:userId Status Code 200:
Uncaught Error: socket hang up
at createHangUpError (_http_client.js:302:15)
at Socket.socketOnEnd (_http_client.js:394:23)
at endReadableNT (_stream_readable.js:975:12)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickCallback (internal/process/next_tick.js:104:9)
我假设这些错误要么摩卡干试图初始化我的应用程序的另一个实例已经运行或在测试前运行服务器有机会重新启动。 (我认为这是因为它有时会成功运行)
我不得不认为这是一个相当常见的用例,所以我想知道做这种事情的标准方法是什么。
脚本的package.json
"scripts": {
"test": "mocha --compilers js:babel-register --watch",
"start": "nodemon src/index.js --exec babel-node --presets es2015,stage-2"
}
失败user/userId
单元测试:
import http from 'http'
import assert from 'assert'
describe('GET /user/:userId',() => {
it('Status Code 200', done => {
http.get('http://localhost:3000/user/1', res => {
assert.equal(200, res.statusCode)
done()
})
})
})
的src/index.js
import express from 'express'
import User from './controllers/user'
const app = express()
app.get('/user/:userId',new User().getUser)
export default app.listen(3000)
这真的取决于你如何测试这个。看起来您还没有在您的测试中启动服务器,因此您当前正在向不可用的服务发送请求。您必须在before块中启动服务器,并在after块中关闭它,具体取决于您的服务器运行所依赖的测试/套件数量。 – shanks