Gulp + Mocha + Supertest

Node上でAPIのテストをしたいのでSupertestを導入した。全部CoffeeScriptでやっているので注意

install

npm i -D mocha gulp-mocha supertest  

とりあえずInstall

gulpfileの編集

mocha = require "gulp-mocha"  
gutil = require "gulp-util"

config =  
  path:
    coffee:"./src/client/javascripts/**/*.coffee"
    spec: "./test/**/*Spec.coffee"

#test
gulp.task "mocha", ->  
  gulp.src [config.path.spec],{ read:false }
    .pipe mocha {
      reporter: "spec"
    }
    .on "error",gutil.log

gulp.task "watch-mocha", ()->  
  gulp.watch [
    config.path.coffee
    config.path.spec
  ],["mocha"]

gulp.task "test",[  
  "mocha"
  "watch-mocha"
],->

これでgulp testでテストが走り監視も走る。

app.coffee

app.listen config.express.port  
module.exports = app  

ExpressのObjectをSupertestに渡したいのでModule.Exportsしておく

Spec

app = require "../src/server/app"  
request = require("supertest")(app)

describe "SuperTestのテスト", ()->  
  it "indexにアクセスできる",(done)->
    request
      .get "/"
      .expect 200,done

結果

molt $ gulp test  
[00:00:07] Requiring external module coffee-script/register
[00:00:08] Using gulpfile ~/hoge/gulpfile.coffee
[00:00:08] Starting 'mocha'...
[00:00:08] Starting 'watch-mocha'...
[00:00:08] Finished 'watch-mocha' after 20 ms


  SuperTestのテスト
    ✓ indexにアクセスできる (777ms)


  1 passing (802ms)

[00:00:10] Finished 'mocha' after 1.42 s
[00:00:10] Starting 'test'...
[00:00:10] Finished 'test' after 27 μs

問題発生

OKOK、と思ってSpecを書き直してみたところエラーが…

Error: listen EADDRINUSE :::5100  
  at Object.exports._errnoException (util.js:837:11)
  at exports._exceptionWithHostPort (util.js:860:20)
  at Server._listen2 (net.js:1231:14)
  at listen (net.js:1267:10)
  at Server.listen (net.js:1363:5)

アハーン…。どうもご丁寧にサーバの立て直しをしているみたいだ…。うーん…。とりあえずServerのCloseをしてみればいいんだろうかね…。ってか勝手に落としてくれないのか…

暫定対応

app.coffee

server = app.listen config.express.port

expObj =  
  app: app
  server: server
module.exports = expObj  

Spec

expObj = require "../../src/server/app"  
request = require("supertest")(expObj.app)

describe "SuperTestのテスト", ()->  
  after ()->
    expObj.server.close()

  it "indexにアクセスできる",(done)->
    request
      .get "/"
      .expect 200,done

ServerObjectを取得できるようにしてサーバをafterでCloseするように…。これだとSpecごとにサーバ開いたり落としたりするのでお行儀がよくない気がする…。うーん、どうすればいいんですかね。教えてください。

参考