• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

spec_helper.rbの中でRSpec.configure を呼び出している場合、 以下のような警告が出てくることがあります。

   1  ******************************************************
   2  DEPRECATION WARNING: you are using deprecated 
   3  behaviour that will be removed from RSpec 3.
   4  
   5  You have set some configuration options after an 
   6  example group has already been defined.  In RSpec 3,
   7  this will not be allowed.  All configuration should 
   8  happen before the first example group is defined.
   9  The configuration is happening at:
  10  
  11    /path/to/app/spec/spec_helper.rb:50
  12  ******************************************************

これは spec_helper.rb が何度も呼び出されてしまうことで、 configureブロックが2回以上呼び出されてしまうために起こる問題です。

そもそも Ruby の require は一度しかファイルを読み込まないように なっていますが、読み込んだかどうか判定する基準となるのが 読み込み対象のファイルの絶対パスではなく、require に渡された引数であるため、同じファイルをrequireしてもパスの指定の仕方によって何度も読み込まれてしまうのです。

そこで、以下のように spec_helper.rb の先頭に記述することで、 二度読みを回避して警告されないようにすることができます。

   1  $LOADED_FEATURES.push File.expand_path(__FILE__)
   2  def require(path)
   3    path = File.expand_path(path) if path =~ %r{^[./]}
   4    super path
   5  end

require を上書きして引数が "." か "/" で始まっている場合に expand_path を呼び出して正規化しています。 自分自身が呼び出される時のrequireは上書きできないので、 $LOADED_FEATURESに自分自身の絶対パスを追加しておきます。 require は $LOADED_FEATURESにpathが存在するする場合はスクリプトを読み込まなくなります。

posted by Png genki on Mon 30 May 2011 at 13:00
Contents
RSpecで spec_helper.rb が何度も読み込まれる問題を回避する
Comments
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
tkawa: http://devcenter.heroku.com/articles/rails31_he... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ