とある角度から

お腹いっぱいたべられる幸せ

rubyを実行するgruntプラグイン作るまで(3) - テストの記述

rubyを実行するgruntプラグイン作るまで(2) - 非同期でのコマンド実行 - 1010realのブログ ver2の続きです。

以前作ったgrunt-cclogdeleteをもう少し汎用的にして、外部コマンドを非同期実行するgrunt-run-asyncを作成しました。 外部コマンドなら何でも良いので、rubyに限らず、色々指定できます。

github.com

上記をnpmに登録する前に行った、gruntプラグインのテストの記述について、やったことを書いていきます。

1.テストを書く

grunt-initテンプレートで作成された、テスト用フォルダの構成は以下の通り。

  • test : テスト用ファイル置き場
    • fixtures : タスク実行対象ファイル
    • expected : タスク実行後の(期待する)結果
    • xxxxx_test.js : テスト用js
    • tmp : grunt testを実行すると作られる。タスク実行後の結果ファイルがここに出力される

grunt testを実行すると、test/fixtures内のファイルを対象にタスクを実行し、結果をtmp配下に出力します。
その後、出力結果がtest/expected内のファイルと正しいかどうかでテスト通過判定しているので、その辺のつじつまを合わせてあげれば良い。
(「grunt testを実行してつくられるtmpフォルダの中身 == test/expectedの中身」となればテスト成功)

2.テストを通るまで機能をデバッグ

grunt testを繰り返し、Done, without errors.を目指す。 f:id:n_1010real:20170418134452p:plain

3.jshintを通す

デフォルトのgruntタスクを叩くと、jshint後に記述したテスト(grunt test)を実行する模様。
せっかくなら両方通したいので、jshintが通るように、jsを整理します。

ここで、nodeのバージョンを最新(v6.10.2)にあげたら、jshintでエラーがでたので、grunt-contrib-jshintモジュールを最新にあげました。

npm uninstall grunt-contrib-jshint --save-dev
npm install grunt-contrib-jshint --save-dev

で試したら、別のエラーがでました。 f:id:n_1010real:20170418135225p:plain

Promiseが定義されてないとのこと。jshintでes2015を許容しない設定になっているようです。
.jshintrcに以下のオプションを追加したら、問題なくjshintを通りました。

"esnext": true

最終的に、grunt test を実行し、jshint -> 用意したtest が全て通ればOKですね。 f:id:n_1010real:20170418135658p:plain

次回は、npmへの登録部分を書きます。 他のサイトに書いてあることをそのままやっただけなので、書くのはやめました。