Kanazawa.rb meetup #14 に参加してきた

Meetup #14 - Kanazawarb

Jasmine gem + PhantomJSの話まとめ

これはもくもくの成果。

Jasmineの話はこんな感じで何回か書いてるのですが、

今回は

  • PhantomJSと組み合わせるときの話
  • specをCoffeeScriptで書いているときの話

を自分用にまとめます。

PhantomJSと組み合わせる

これは実はすごく簡単。Jasmine は以前から Selenium を利用した jasmine:ci という rake task を持っているので、

を組み合わせれば PhantomJS を呼び出すことができる。

PhantomJS は1.8 で SeleniumDriver である GhostDriver を integrate してるので、1.8 以降を使わないといけない。

jonleighton/poltergeist も PhantomJS 1.8 以降を使うように README には書かれているが、実は Poltergeist 1.4.1 の段階では PhantomJS 1.7 でも動く。

ブラウザの設定方法

  • 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を使う

guard/guard-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とかについて発表してきた

内容としてはテスティングフレームワークについてほんとにざっくり概観してみたっていうのと、普段やってることと使っているツール、そしてそこにどちらかというと若い人向けに継続的に学ぶこと、ツールを闇雲に追うだけでなく、より本質を学ぼう、それは寿命の長い知識やスキルになるよ、というおっさんくさい話をしてきた。

どこまで伝わったか分からないけど、自分は満足しました。はい。

参考リンクは以下。

  1. 実は expect で guard から all を実行して guard-coffeescript の機能を使ってすべてコンパイルするというのをやってみたんだけど、うまくいったりいかなかったりするので諦めた。 

More