Rails + Jasmine gem 1.2 の環境を新しく作ったところ、なんか変だなと思うところがあったのでメモ。
Comedy is Hard - Jasmine 1.2 released
Jasmine は 1.2 から assets pipeline 環境の自動判別機能が入って、reporter のデザインも変わってなかなか格好よくなりました。
Jasmine gem 1.2でrails g jasmine:installしたときのjasmine.yml
src_files:
- assets/application.js
って書いてある。なんかこれおかしくないですか。こんなパスは存在しない。
ということで試してみた。
assets環境Rails
OK | assets/application.js |
OK | application.js |
NG | app/assets/javascripts/application.js |
NG | assets/javascripts/application.js |
NG | javascripts/application.js |
NG | blank |
上記の NG はテストを実行して fail になる。
NG | *.js |
NG | **/*.js |
そもそもテストが実行されない。ということで個人的には
application.jsのみ
がいいように思う。
いずれにせよ assets 環境下では SprocketsHelper などの働きによって application.js を指定するだけで依存している js すべて読み込んでテスト可能になった。
非assets環境Rails
- Rails 3.0.x + Jasmine 1.2 は従来通り public/**/*.js で ok
- assets.enabled = false も従来通り
こっちは簡単ですね。
assets環境下で何が起きてるのか
こっから先はあの assets/application.js という気持ち悪い書き方の話。これは jasmine gem の中の
lib/jasmine/asset_pipeline_mapper.rb
の中で
def files
@src_files.map do |src_file|
filename = src_file.gsub(/^assets\//, '').gsub(/\.js$/, '')
@context.asset_paths.asset_for(filename, 'js').to_a.map { |p| @context.asset_path(p).gsub(/^\//, '') + "?body=true" }
end.flatten.uniq
end
でやってる、
filename = src_file.gsub(/^assets\//, '').gsub(/\.js$/, '')
が理由。そのあとの
@context.asset_paths.asset_for(filename, 'js') ...
で js の filename に該当する asset の情報を取得するんだけど、その前になぜか
gsub(/^assets\//, '')
が入っているから、
たまたま assets/application.js は application.js と解釈される
ようになっている。これたぶんなんか勘違いして jasmine.yml に assets/ って書いちゃって、無理矢理動くようにしちゃったんじゃないかなぁ…。まぁこのコードはもう取り除くの難しいけど、
せめてデフォルトは application.js に直してほしい
とは言え、この微妙な話題を英語で pull-req する自信はないなぁ…。