ratio - rational - irrational

« ソースコードを見た人が呆れるプログラムを作ろう企画 | Main | ドキュメント形式 »

2007年03月13日

RSpecにおけるコンテキストをまたぐ共通部分

先日書いたSeleniumRC specの中で使ってたテクニックが最近、会社で流行ってる。

2007-12-04追記: このテクニックはRSpec 0.8以前のために開発しました。RSpec 1.0以降ではshared behaviourを使いましょう。ただ、RSpecをいじくる技法の基礎として参考にはなるかもしれません。

コンテキストにおける共通の初期化処理は勿論、setupやcontext_setupに書けばいいんだけど、問題は複数のコンテキストにまたがる共通の初期化処理。あるいは、modelのspecでfixtureを設定したり、controllerのspecにおいてコントローラー名を指定したり。

これらって、いちいち書くのがなんかDRYじゃない気がする。特に、1つのmodelに対するspecがcontextから構成されるとき(諸橋さん方式。contextという言葉の意味合いから言えば、無理に1つのコンテキストにするよりこの方が自然なはず)、でもfixtureの読み込みは毎回同じだったり。コントローラー指定はよく書き忘れるけど、書き忘れるとよく分からないエラーが出るし。

で、こうするわけだ。model Hogeに対するspecであるとすれば、そのspecファイルの頭でこんなメソッドを定義する。

def hoge_context(*args, &block)
  context(*args) do
    fixtures :hoge, :huga, :hugu
 
    context_setup do
       # なんか共通の初期化
    end

    instance_eval(&block) 
  end
end

で、以降はcontextの代わりにhoge_contextを使用する。DRYで安全。お手軽簡単。



トラックバック

この記事のトラックバックpingのURL:
http://idm.s9.xrea.com/blog/mt-tb.cgi/594

コメント

新しくコメントをつける

よくわからない理由により、コメントが即座には反映されないかもしれませんか゛、ボタンを押して元の画面に戻ってきたならたぶん正しく送信されています。




blog操作

検索


カテゴリー

このブログについて

あわせて読みたい

follow yugui at http://twitter.com
© 2007 Yugui

Powered by Movable Type 3.2-ja-2