Skip to content

Instantly share code, notes, and snippets.

@mohayonao
Last active December 26, 2015 22:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mohayonao/7226798 to your computer and use it in GitHub Desktop.
Save mohayonao/7226798 to your computer and use it in GitHub Desktop.
istanbul + mocha + grunt
grunt.registerTask 'coverage', ->
path = require 'path'
istanbul = require 'istanbul'
Instrumenter = istanbul.Instrumenter # 計算用のファイルを作る
Collector = istanbul.Collector # 集計する
Reporter = istanbul.Reporter # 出力する
hook = istanbul.hook # あとで説明する
coverageVar = "$$cov#{Date.now()}$$"
instrumenter = new Instrumenter(coverageVar:coverageVar)
transformer = instrumenter.instrumentSync.bind(instrumenter) # 計算用のファイルを書き出す関数
testFiles = [] # テストファイルを集める
srcFiles = [] # ソースコードにチェックをつける
grunt.file.expand('src/**/*.*').forEach (file)->
file = path.resolve path
if /_test\.js$/.test path
testFiles.push file
else
srcFiles[file] = true
# hookRequire で require をインジェクションする
# 具体的には srcFiles にチェックのあるファイルが require されたときに
# カバレッジ計算用に改造されたファイルが返るようにしている
matchFn = (file)-> srcFiles[file]
hook.hookRequire matchFn, transformer
# 集計結果はここに入る
global[coverageVar] = {}
## ここから普通に mocha のテスト
Mocha = require('mocha')
mocha = new Mocha
files.forEach (file)->
mocha.addFile file
done = do @async
mocha.reporter('nyan').run ->
# テストが終わったら集計も終わっているので出力して終わり
reporters = []
reporters.push Reporter.create 'text-summary'
reporters.push Reporter.create 'lcov', dir:'coverage'
cov = global[coverageVar]
grunt.file.write 'coverage/coverage.json', JSON.stringify cov
collector = new Collector
collector.add cov
reporters.forEach (report)->
report.writeReport collector, true
done()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment