高尾宏治日記 on はてなブログ

プログラミング言語Rubyを中心とした技術情報を扱うブログです(Microsoft Surfaceはやめました)。

Turnipによる受け入れ試験中に、Rails.envをtestではないのもの(standalone)に変更する方法 (その1) #RubyJP

smalruby-editorの受け入れ試験はTurnipで実装

開発中のWebベースのテキストエディタ smalruby-editor では、ローカルマシンで smalruby-editor コマンドを実行すると、Webベースのエディタを起動できる standalone モードというのを提供しています。これは、 Rails.envstandalone に設定して、いくつかの環境変数の設定と、ホームディレクトリにログなどのファイルを書き込むように設定してから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-p353rails 4.0.2)

私としては、@standalone タグを付与したシナリオがあれば再コンパイルをさせたいのですが、その方法がわかっていません。

PhantomJS がキャッシュしているのかもしれませんし、Rails がキャッシュしているのかもしれません。なかなか難しいです。

もう少し調べてみて実現が難しそうだったら別の方法を考えることにしようと思います。別の方法とは standalone モードかどうかの条件分岐を *.js.coffee.erb で行うことはやめて、 *.html.erb で行うというものです。

でも、app/assets/javascripts/editor.js.coffee.erb を任意のタイミングで再コンパイルする方法を知っておくのも面白そうなので、もう少し調べてみようと思います( ̄▽ ̄)