Kanazawa.rb meetup #14 に参加してきた
Jasmine gem + PhantomJSの話まとめ
これはもくもくの成果。
Jasmineの話はこんな感じで何回か書いてるのですが、
- Jasmineをもう少し詳しく紹介してみる - あーありがち(2010-12-07)
- Jasmine gemで特定のjsファイルを除外する - あーありがち(2012-03-08)
- Rails + Jasmine gem 1.2のsrc_filesの与え方 - あーありがち(2012-10-21)
今回は
- PhantomJSと組み合わせるときの話
- specをCoffeeScriptで書いているときの話
を自分用にまとめます。
PhantomJSと組み合わせる
これは実はすごく簡単。Jasmine は以前から Selenium を利用した jasmine:ci という rake task を持っているので、
- PhantomJS
1.8+ - SeleniumWebDriver
2.27.0+
を組み合わせれば PhantomJS を呼び出すことができる。
PhantomJS は1.8 で SeleniumDriver である GhostDriver を integrate してるので、1.8 以降を使わないといけない。
※ jonleighton/poltergeist
ブラウザの設定方法
- 1.2未満は環境変数 JASMINE_BROWSER で指定する
- 1.2以降は以下のように設定ファイルで設定できる
Jasmine.configure do |config|
config.browser = :phantomjs
end
1.3 で jasmine init した場合は spec/support/jasmine_helper.rb に書くようになるらしい。
specだけCoffeeScriptを使う
を使うとすぐできる。
ただし、Jasmine 自体は spec/javascripts/ 以下に JavaScript で spec が置かれていることを期待しているので、CoffeeScript しか書いていない場合は `rake jasmine` してブラウザでアクセスしてもテストはコケてしまう。
そこでこんな感じのprepareコードを用意してみた。
desc 'compile spec/coffeescripts' | |
namespace :jasmine do | |
task :prepare do | |
ENV['EXECJS_RUNTIME'] = 'SpiderMonkey' if system('which js > /dev/null') | |
require "coffee-script" | |
src = File.dirname(__FILE__) + '/spec/coffeescripts' | |
dest = src.sub(/coffeescripts\z/, 'javascripts') | |
Dir.glob("#{dest}/**/*{_,}[Ss]pec.js").uniq.each { |js| | |
FileUtils::Verbose.rm(js) | |
} | |
Dir.chdir(src) { | |
Dir.glob('**/*{_,}[Ss]pec.coffee').uniq.each { |coffee| | |
code = CoffeeScript.compile(open(coffee).read, :bare => true) | |
if ( code ) | |
open(File.join(dest, coffee.sub(/\.coffee\z/, '.js')), 'w') { |js| | |
js.puts code | |
puts "Generated #{js.path}" | |
} | |
end | |
} | |
} | |
end | |
end |
ちょっとかっこ悪いし guard-coffeescript と二重化してるんだけど、他にあんまりうまい解決策を思いついてない1。
rake jasmine:ci
の前に
rake jasmine:prepare
を実行すると、一応いい具合に動く。
TDDとかについて発表してきた
内容としてはテスティングフレームワークについてほんとにざっくり概観してみたっていうのと、普段やってることと使っているツール、そしてそこにどちらかというと若い人向けに継続的に学ぶこと、ツールを闇雲に追うだけでなく、より本質を学ぼう、それは寿命の長い知識やスキルになるよ、というおっさんくさい話をしてきた。
どこまで伝わったか分からないけど、自分は満足しました。はい。
参考リンクは以下。
実は expect で guard から all を実行して guard-coffeescript の機能を使ってすべてコンパイルするというのをやってみたんだけど、うまくいったりいかなかったりするので諦めた。 ↩