あとやりたいことは、CoffeeScriptを使ってる時でも同じようにテストを書けるようにするのと、ファイル分割。
どちらを先にやるかだけど、後でわざわざ書き直すめんどくささもさることながら、それで動かなくなって悩むのは嫌なので、Coffee化を先にやることにした。
前回のmain.jsは
var a = 1;
だけだった。これをCoffeeScriptで書くと
a = 1
となるわけだが、これをコンパイルしたmain.jsを使うようにするだけで、前回書いたテストは通らなくなる。なぜかというと、CoffeeScriptから生成されるJavaScriptは、無名関数で囲われていて、グローバル汚染を防いでくれている。
つまり、先ほどのmain.coffeeをjsにコンパイルすると
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function() { | |
var a; | |
a = 1; | |
}).call(this); |
こうなるので、変数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
テストコードは変えないままグリーンになる。というわけでこういう風に書ける
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
window.Camera = class Camera | |
take: -> | |
# do nothing |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
}); | |
}); | |
}); |
ここではやってないけど、テストもcoffeeで書けばいいと思う。
そしてひと区切り。あとはファイル分割する。
ここまでまとめたやつ。
https://github.com/zakuni/js-template/tree/v0.0.2
0 件のコメント:
コメントを投稿