おもしろWEBサービス開発日記の続きです。メソッドbefore(:all)とbefore(:each)がある。初期状態ごとにグループ化するのに使う。通常はbefore(:each)を使ってexample毎に初期状態を作り直した方がいい。しないと別のexampleに移行するときに状況が変になっちゃうかもしれないので。before(:all)を使う時は気をつけるべき。適当に使うとバグの温床になりかねない。ネットワークの接続をopenするとかの時にbefore(:all)を使うといい。通常、それぞれ分離されているexampleではbefore(:all)は使わない。メソッドafter(:each)はあんまり使わない。それぞれのexampleは独自のスコープで実行されて、exampleの実行後にインスタンス変数はスコープ外になるから。場合によってはとても使える。stateを修正してafter(:each)で元に戻すことでうまいことできる。@original_global_valueendafter(:each)は、exampleがfailureだったりエラーが起こっても必ず実行される。after(:all)はafter(:each)よりもさらに使われることがまれだけど使うのが妥当なときがある。ブラウザを閉じるデータベースのコネクションを閉じるsocketsを閉じるなどなど、基本的になにかを確実にシャットダウンさせたいときに使う。beforeやafterを使うことで、テストがDRYになるだけじゃなくてexampleが理解しやすくなる。group内でメソッド定義してDRYに。endend上記のようにブロックを使うと見やすくなる。これを使う使わないは個人の好み。given_thing_withメソッドを理解するために別の場所のソースを読む必要があるというのが欠点。この種類の間接的な手法は使いすぎると良くない。それぞれのコードベースで一貫性を保つことが大事。groupで共有したいときは、moduleとして定義して、describeブロックのなかでincludeする。groupの中で使いたいmoduleがあるときには、configファイルでincludeする。groupでinclude出来る。下記のように、shared_examples_forで宣言する。examplesはbeforeが実行されてから実行されるので大丈夫。Moduleshare_examples_forとit_should_behave_likeと同じことが、share_asメソッドとincludeでできる。exampleはとても使いどころが限られている。ほかのexampleと状態を共有するにはインスタンス変数を共有するくらいしかできない。it_should_behave_likeメソッドでは状態をグループに渡すことが出来ない。exampleは使いどころが限られる。やりたいならカスタムマクロなるものを作るといいらしい。groupのネストっていうのはこういうこと。endend外側のgroupはExampleGroupのサブクラス。内側のgroupは外側のgroupのサブクラス。includeしたモジュールなど、外側のgroupで宣言したものは内側のgroupでも使える。beforeやafterを内側、外側のgroup両方で使ったときは外側のbefore内側のbeforeexample内側のafter外側のafterの順番で実行される。groupは同じオブジェクトのコンテキストで実行されるので、beforeブロックで設定した状態は複数のexampleでシェアできる。段階的なsetupができる。具体的には下記のように外側のgroupで前提を設定して、内側のgroupでイベントを設定するみたいな感じのことができる。個人的には後者に賛成で、なるべくこういう構造にするのは避けた方がいい。理由はfailureな理由を理解するのが大変になるから。最終的に何が自分に適しているかを見つける必要があるし、こうすることも出来るよというのを知って欲しかった。注意して使って欲しい。groupはいつも使ってる。私はコンセプトををまとめるのにネストを使っていて、状態を作るのには使ってない。上記の例を私ならこんな風に書く。endendbeforeは全然使わないという方法もある。end上記の例はたぶん三つの例の中で一番読みやすい。ネストされたdescribeのブロックは概念とドキュメントを結合したものを提供する。この方法のいいところは、failureになったときに一カ所だけ見ればいいこと。悪い点は、三つの例の中で一番DRYでないこと。Stackのコンストラクタを変更するとしたら、二カ所変更する必要がある。完璧なexampleだったらもっと必要。