Help us understand the problem. What is going on with this article?

grunt watch で変更したファイルに関連するテストだけ実行する

More than 5 years have passed since last update.

たとえば、 app/models/hoge.coffee を編集したときに、 test/app/models/hoge_test.coffee だけ、テストを実行したいときってありますよね。自分は以下のような感じでやっています。

Gruntfile.coffee

module.exports = (grunt) ->
  grunt.initConfig
    pkg: '<json:package.json>'

    mochacli:
      options:
        timeout: 3000
        ui: 'bdd'
        reporter: 'spec'
        compilers: ['coffee:coffee-script']
      app:
        src: 'test/app/**/*_test.coffee'

    watch:
      test:
        options:
          spawn: false
        files: [
          'app/**/*.coffee'
          'test/app/**/*.coffee'
        ]

  grunt.loadTasks 'tasks'
  grunt.loadNpmTasks 'grunt-mocha-cli'
  grunt.loadNpmTasks 'grunt-contrib-watch'

tasks/watch-test.coffee

fs = require 'fs'
_ = require 'lodash'

module.exports = (grunt) ->
  lastModified = 0

  runAllTests = _.throttle ->
    grunt.task.run 'mochacli:app'
  , 30000

  grunt.event.on 'watch', _.throttle((action, filepath, target) ->
    return unless target is 'test'

    currentTime = new Date().getTime()
    if currentTime - lastModified < 2000
      runAllTests()
      return
    lastModified = currentTime

    if _.startsWith(filepath, 'app')
      testpath = 'test/' + filepath.replace(/\.coffee$/, '_test.coffee')
    else
      testpath = filepath
    return unless fs.existsSync(testpath)

    grunt.config 'mochacli.changed.src', testpath
    grunt.task.run 'mochacli:changed'
  ), 200

短い間隔でファイルを更新すると、テスト全実行されたり、Git で branch を切り替えたりしたときに、たくさんテストが実行されないように、_.throttle で実行間隔を絞ってるのがポイントです。

shiwano
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away