Turnipによる受け入れ試験中に、Rails.envをtestではないのもの(standalone)に変更する方法 (その1) #RubyJP
smalruby-editorの受け入れ試験はTurnipで実装
開発中のWebベースのテキストエディタ smalruby-editor では、ローカルマシンで smalruby-editor
コマンドを実行すると、Webベースのエディタを起動できる standalone
モードというのを提供しています。これは、 Rails.env
を standalone
に設定して、いくつかの環境変数の設定と、ホームディレクトリにログなどのファイルを書き込むように設定してからRailsのサーバ( rails server
コマンドで起動するやつ) を起動することで実現しています。
standalone
モードのときには作成したプログラムをローカルマシンに直接保存する機能を提供する予定なのですが、この機能の受け入れ試験 (spec/acceptance/
以下の feature
) の実装が難しくて困っています。
smalruby-editor の受け入れ試験は Turnip を使って記述しています。
特定のシナリオのRails.envを切り替える
feature
の途中で standalone
モードに切り替えるためには Rails.env = 'standalone'
を実行する必要があります。これは、 spec/spec_helper.rb
に以下の記述をして、当該 feature
のシナリオに @standalone
タグを付与することで実現できました。
config.before(standalone: true) do @_rails_env = Rails.env Rails.env = ENV['RAILS_ENV'] = 'standalone' end config.after(standalone: true) do Rails.env = ENV['RAILS_ENV'] = @_rails_env end
でも、これだけではダメでした。
求む、任意のタイミングで*.js.coffee.erbを再コンパイルする方法
どのようにダメかというと、smalruby-editor では、 app/assets/javascripts/editor.js.coffee.erb
の中で、 <% if Rails.env == 'standalone' %>
といった ERB
での条件分岐を行っています。いくつかの動作確認の結果から、 feature
の処理中に app/assets/javascripts/editor.js.coffee.erb
は一度しかコンパイルされないため、最初にコンパイルしたときの Rails.env
(test か standalone のどちらか) のものを使い続けることがわかりました。 (ruby 2.0.0-p353
、rails 4.0.2
)
私としては、@standalone
タグを付与したシナリオがあれば再コンパイルをさせたいのですが、その方法がわかっていません。
PhantomJS
がキャッシュしているのかもしれませんし、Rails
がキャッシュしているのかもしれません。なかなか難しいです。
もう少し調べてみて実現が難しそうだったら別の方法を考えることにしようと思います。別の方法とは standalone
モードかどうかの条件分岐を *.js.coffee.erb
で行うことはやめて、 *.html.erb
で行うというものです。
でも、app/assets/javascripts/editor.js.coffee.erb
を任意のタイミングで再コンパイルする方法を知っておくのも面白そうなので、もう少し調べてみようと思います( ̄▽ ̄)