2012-10-21

Rails + Jasmine gem 1.2のsrc_filesの与え方

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

OKassets/application.js
OKapplication.js
NGapp/assets/javascripts/application.js
NGassets/javascripts/application.js
NGjavascripts/application.js
NGblank

上記の 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 する自信はないなぁ…。

About

例によって個人のなんちゃらです