今日は割と Spike な branch ばかりつくっていたので、その備忘録などを兼ねて。
https://github.com/visionmedia/supertest
supertest は express の app のテストを書くことができるようになる。今やってるプロジェクトはそれぞれのユニットテストはテストファーストで書きながら TDD よろしくサイクルさせていたのだけれど肝心の結合部分であるところの app.js
はノンテストっていう状況だった。
そのせいで、デグレてしまうこともあったのでいい加減この結合部分もテスト書かなくては!と使命感に駆られて書いた。
これで安心して枕を高くして寝れる。
http://jashkenas.github.io/docco/
Docco は node.js と Python の合わせ技のドキュメント生成ツール。上記の supertest を書いていると、app.js
のテストを書いたら API の総覧が読めたら便利なんじゃね!?となって、ドキュメント生成系のライブラリを調べてまわったらこれに落ち着いた。Markdown で書けるというのがやっぱりイイ。
最初は
# # hogehoge
# wawawa
describe "hoge", ->
it "hogehoge", ->
# some()
みたいな感じでコメントに Markdown を書きつけるという手法で書いていたのだけれど、これはあまりにもめんどくさすぎるので調べてみると Coffeescript の Literate という機能が使えるようで .litcoffee
という拡張子で保存すると、Coffeescript Litterate の構文でコンパイルしてくれる。肝心の文法は
# hogehoge
wawawa
describe "hoge", ->
it "hogehoge", ->
# some
というように、普通に Markdown を書くように Markdown を書き、改行してひとつインデントをつけるとコードとして認識してくれるようになる。コンパイルされた js のコードには Markdown の部分は完全に無視される。
これがすごく便利でさっそく .litcoffee
の書式で書きなおした。
ただ、かなり歴史の浅い記法なので Sublime Text 2 の Syntax Highlighter がなくて、コードを書くときがめちゃくちゃ読みにくい。Docco で生成されたドキュメントでは Coffee 部分が Syntax Highlight されているので読みやすいからまだいいけれど。
とはいえ、テストは簡単なであるにこしたことはないし Coffeescript Literate で書いた方が後々楽。ま、Syntax Highlight された方がいいので(誰かつくって)つくるか。
https://github.com/petejkim/factory-lady
ruby の factory_girl は何度も耳にしたことがあって、node にもあったらいいなあ、とおもっていたらあった。factory_girl に対して factory-lady っていうこのセンスよ。
Factory.define
で定義しておけばモリモリテスト用のデータを生成できるし、このライブラリだと Mongoose の接続先に Factory.create
で保存してくれるので便利。
今日はひたすらテストとドキュメントを作っていた。これまでは、
- Wiki に Markdown で書く
- テストを書く
- モジュールを書く
みたいな順番で開発フローを回していたけれど、これが
- テストとドキュメントを書く
- モジュールを書く
にスッキリとマージされてより快適になった。これまでは、軽い仕様変更に対してとりあえず
- Wiki の修正
- テストの修正
- コケるコードを動くようにする
というフローでこれに対応していたので、時々 Wiki を修正し忘れて Wiki とテストが乖離するといった事態が起きてぐっちゃりとしがちだったけれど、その部分が統一化されて
- テストコードの修正(同時に Markdown の修正)
- コケるコードを動くようにする
で対応できるようになったのでそういった事態が起きにくくなった。
同期によると Haskell はもっと高度にこういったことができるらしい。すごい。
console.log "Enjoy writing happy testable code life!"
Coffeescript literate を Sublime Text 2 で書くときは
https://github.com/jashkenas/coffee-script-tmbundle
に literate 用の
.tmLanguage
あるのでこれ使えばいいっぽい。