2017-05-06 36 views
0

我有一个express API,我正在开发,并且正在尝试使用该项目来学习所有express的最佳实践。这就是说我想为我的终端编写单元测试。我一直在试图弄清楚如何运行我的开发服务器以及在手表模式下运行我的摩卡测试。这个问题是,因为mochanodemon正试图重新启动/同时运行,我会在我的测试中得到不同的结果,而这种结果会在手表模式下失败。在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) 
+0

这真的取决于你如何测试这个。看起来您还没有在您的测试中启动服务器,因此您当前正在向不可用的服务发送请求。您必须在before块中启动服务器,并在after块中关闭它,具体取决于您的服务器运行所依赖的测试/套件数量。 – shanks

回答

3

我也有这个问题。我看了看,nodemon的git的网页,发现这个 nodemon config

你可以问nodemon忽略测试文件保存,所以它不会重新启动,并在测试的方式获得。

这只是真的解决了我的问题时,虽然改变测试文件。

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

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

这需要重新运行的每一个服务器重启时间的考验的照顾。

相关问题