在监视模式下使用nodemon和mocha测试Express端点会发生冲突

时间:2017-05-06 18:38:49

标签: javascript unit-testing express ecmascript-6 mocha

我有一个快速api我正在开发,我正在尝试使用这个项目来学习快递的所有最佳实践。话虽这么说我想为我的端点编写单元测试。我一直试图弄清楚如何运行我的开发服务器以及在监视模式下运行我的mocha测试。这个问题是,由于mochanodemon正在尝试重新启动/同时运行,因此我的测试会得到不同的结果,这有点违背了将其置于监视模式的目的。

我会遇到以下各种错误:

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)

我假设这些错误源于mocha尝试初始化已经运行的应用程序的另一个实例,或者在服务器有机会重新启动之前运行测试。 (我认为这是因为它有时会成功运行)

我必须认为这是一个相当常见的用例,所以我想知道做这类事情的标准方法是什么。

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)

1 个答案:

答案 0 :(得分:3)

我也有这个问题。我查看了nodemon的git页面,发现了这一点 nodemon config

您可以要求nodemon忽略测试文件保存,因此它不会重新启动并妨碍测试。

这只是在改变测试文件时才真正解决了我的问题。

我使用的另一个解决方案是运行

nodemon src/app.js --exec "mocha"

每次重新启动服务器时都会重新运行测试。