ページ

2013年6月10日月曜日

JavaScriptのテスト環境を整える その2

前回の続き。

あとやりたいことは、CoffeeScriptを使ってる時でも同じようにテストを書けるようにするのと、ファイル分割。
どちらを先にやるかだけど、後でわざわざ書き直すめんどくささもさることながら、それで動かなくなって悩むのは嫌なので、Coffee化を先にやることにした。
前回のmain.jsは
var a = 1;
だけだった。
これをCoffeeScriptで書くと
a = 1
となるわけだが、これをコンパイルしたmain.jsを使うようにするだけで、前回書いたテストは通らなくなる。

なぜかというと、CoffeeScriptから生成されるJavaScriptは、無名関数で囲われていて、グローバル汚染を防いでくれている。
つまり、先ほどのmain.coffeeをjsにコンパイルすると
(function() {
var a;
a = 1;
}).call(this);
view raw main.js hosted with ❤ by GitHub

こうなるので、変数aには外部からアクセスできず、ReferenceErrorになってしまう。

尚、コマンドラインからmochaを使ってテストする分には
% mocha --compilers coffee:main.coffee
みたいにすると中でうまいことやってくれてcoffeeでもテストを通すことができる。
(今回書いてるやつそのままでは通らない。-uオプションでtddを指定したり、chaiをrequireする必要がある)

前回は素のJavaScriptの話だったのでブラウザで実行することを重視したけど、CoffeeScript書いてるならnpmも使ってることが多いだろうし、それなら素直にコンソールでmochaを使えばいいような気がする。

そして気づいたけど、前回使ったbowerはインストールするのにnpm使ってるだろうから、ブラウザにこだわる必要はないような気もしてきた。
ただ、mochaとかchaiをファイルでダウンロードしてきて使う人とかもいるだろうと思えば、意味はあるので一応続ける。

無名関数の中で宣言されているのでアクセスできないことについては色んな解決方法があると思う。
簡単な方法の一つは、windowオブジェクトのプロパティにしてしまうこと。
window.a = 1
テストコードは変えないままグリーンになる。

というわけでこういう風に書ける
window.Camera = class Camera
take: ->
# do nothing
view raw main.coffee hosted with ❤ by GitHub
var assert = chai.assert;
suite('Camera', function(){
var camera = new Camera();
suite('#Camera', function(){
test('is instance of Camera', function(){
assert.instanceOf(camera, Camera);
});
});
suite('#take()', function(){
test('is function', function(){
assert.isFunction(camera.take);
});
});
});
view raw test.js hosted with ❤ by GitHub

ここではやってないけど、テストもcoffeeで書けばいいと思う。

そしてひと区切り。あとはファイル分割する。

ここまでまとめたやつ。
https://github.com/zakuni/js-template/tree/v0.0.2

0 件のコメント:

コメントを投稿