一から勉強させてください

最下級エンジニアが日々の学びをアウトプットしていくだけのブログです

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 みてください。

余談ですがGemfilegroup :development, :test doではなく、group :test doの中に書いていた場合、undefined method 'setup' for Teaspoon:Module (NoMethodError)とか出ると思うので注意。このissue#96のやつです。今回テーマとしてるエラーとは別物。

エラー発生

config/initializers/teaspoon.rbspec/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は既に出てるくさいんですけどね。レビューはよ。

ひとまず現時点でテストできなくて困ってる人がもしいたら、この方法で一応実行はできるよーっていう共有でした。

参考