同じexampleを複数のテストで共有する
RSpec documentationの「Shared Example Groups」に説明がありますが、「shared_examples_for」を使用して同じexampleを複数のテストで共有することが可能です。
- 「shared_examples_for <共有exampleグループ名>」で共有するexampleのグループ(「Shared Example Groups」と呼ばれるらしい。)を作成し、
- 共有したいテスト内で「it_should_behave_like <共有exampleグループ名>」としてexampleを取り込めばOK
- モジュールをincludeする感じですな。
- exampleだけでなく、beforeやafterも共有できます。
# shared_examples_for で 共通のexampleを定義。 shared_examples_for "shared" do # 複数のテストで共有するexample it "shared ex1" do puts " shared ex1" end # beforeやafterも定義できる。 before { puts " shared before" } after { puts " shared after" } end describe "foo" do # it_should_behave_likeで共有するexampleを取り込む it_should_behave_like "shared" it "foo ex1" do puts " foo ex1" end before { puts " foo before" } after { puts " foo after" } end describe "var" do it_should_behave_like "shared" end
実行結果です。foo,varで共有exampleとして定義したex1が実行されています。
$ spec -fs shared_example_groups.spec foo shared before foo before shared ex1 foo after shared after - shared ex1 shared before foo before foo ex1 foo after shared after - foo ex1 var shared before shared ex1 shared after - shared ex1 Finished in 0.024 seconds 3 examples, 0 failures
複数のbeforeがある場合の呼びだし順
テスト内に複数のbeforeがある場合、定義された順に実行されるようです。
shared_examples_for "shared1" do before { puts " shared1 before" } after { puts " shared1 after" } end shared_examples_for "shared2" do before { puts " shared2 before" } after { puts " shared2 after" } end # 複数のbeforeがある場合、呼び出し順は定義されている順になる模様 # 以下の場合、 # shared2のbefore, shared1のbefore, fooのbefore # の順で呼ばれる。(afterはその逆) describe "foo" do it_should_behave_like "shared2" it_should_behave_like "shared1" it "foo ex1" do puts " foo ex1" end before { puts " foo before" } after { puts " foo after" } end # 以下の場合、 # fooのbefore, shared1のbefore, shared2のbefore, # の順で呼ばれる。 describe "var" do it "var ex1" do puts " var ex1" end before { puts " var before" } after { puts " var after" } it_should_behave_like "shared1" it_should_behave_like "shared2" end
実行結果です。
$ spec -fs shared_example_groups2.spec foo shared2 before shared1 before foo before foo ex1 foo after shared1 after shared2 after - foo ex1 var var before shared1 before shared2 before var ex1 shared2 after shared1 after var after - var ex1 Finished in 0.023 seconds 2 examples, 0 failures