Rails4.1プロジェクトにteaspoon入れたらエラー出たので調査した
Rails4.1 のプロジェクトでJavaScript
のテストをするためにteaspoon
を入れたらうまく動かなかったので調査。
Rails4.0 で入れたときは問題なかったのに…ツラい。
準備
まずはGemfile
に記述して
group :development, :test do
#ここにrspec関連とか書いてる。
# js spec
gem 'teaspoon'
gem 'guard-teaspoon'
end
bundle install
する。
$ bundle install
CoffeeScript
使いたいので、--coffee
をつけてインストール。
$ rails g teaspoon:install --coffee
これであとは好きなように設定を書いて、teaspoon
(人によってはbundle exec teaspoon
)かrake teaspoon
と打てば、テストを実行できる(はずだったんですよ!!)。詳しくは README みてください。
余談ですがGemfile
でgroup :development, :test do
ではなく、group :test do
の中に書いていた場合、undefined method 'setup' for Teaspoon:Module (NoMethodError)
とか出ると思うので注意。このissue#96のやつです。今回テーマとしてるエラーとは別物。
エラー発生
config/initializers/teaspoon.rb
やspec/teaspoon_env.rb
なども特に変更せず、teaspoon
と打ってみたところこんな感じになりました。
$ teaspoon
Error: Sprockets::Rails::Helper::AssetFilteredError: Asset filtered out and will not be served: add `Rails.application.config.assets.precompile += %w( teaspoon.css )` to `config/initializers/assets.rb` and restart your server
Why?なぜ precompile の設定をせねばいかんのですか。
とりあえず従順にconfig/initializers/assets.rb
をつくってリトライ。
$ teaspoon
Error: Sprockets::Rails::Helper::AssetFilteredError: Asset filtered out and will not be served: add `Rails.application.config.assets.precompile += %w( teaspoon-jasmine.js )` to `config/initializers/assets.rb` and restart your server
ふむ。リトライ。
$ teaspoon
Error: Sprockets::Rails::Helper::AssetFilteredError: Asset filtered out and will not be served: add `Rails.application.config.assets.precompile += %w( support/bind-poly.js )` to `config/initializers/assets.rb` and restart your server
ふむ。
結局、合計 10 ファイル程度を precompile の対象に追加したらやっとテストが動きました。なんだこれは…Rails4.0 でいれたときはこんなことなかったぞ。
とりあえずの対応
同じようなエラーハマった人いないかググったらどんぴしゃなissue#197を発見しました。これです、これ!!
Contributer の方も「Can you explain why you have dev/test set to precompile -- or why you want to include teaspoon in production?」って言ってます。ですよね、僕もそう思います。
ざっと読んでいきます。
config.assets.raise_runtime_errors = false
で直ったぜって記述を発見しました。たしかに前はconfig/environments/development.rb
にこんな設定なかった。
詳細へのリンクを貼ってくれてるので、そいつも確認。
「When you have raise_runtime_errors set to true, dependencies will be checked at runtime so you can ensure that all dependencies are met.」
ふむ。こんな設定がでけたのですね。しかもデフォルトでtrue
。
解除します。config/environments/development.rb
に以下の設定を書いて、
config.assets.raise_runtime_errors = false
テスト実行
$ teaspoon
Starting the Teaspoon server...
Teaspoon running default suite at http://127.0.0.1:59165/teaspoon/default
.............
Finished in 0.03800 seconds
0 examples, 0 failures
動きました。とりあえずこれでテストは実行できそうです(ほんとにこれでいいのか…)。
ちなみに.travis.yml
にもbundle exec teaspoon
を追加して実行してみたのですが問題なく動きました。
まとめ
さきほどの issue#197 も 2014 年 5 月 18 日現在、open 状態なのでまだ解決してない問題かと思われます。やはり Rails はアップデートが頻繁なのでこういうのがツラいですね。引き続き issue や pull-req など動向をチェックしていこうと思います。それっぽい pull-reqは既に出てるくさいんですけどね。レビューはよ。
ひとまず現時点でテストできなくて困ってる人がもしいたら、この方法で一応実行はできるよーっていう共有でした。