Rspecでdescribeをネストしたときの動作

調べてみた。
ネストしていてもあまり気にせず、it単位でbefore/afterが入るみたい。
で、before(:all)/after(:all)はネストされたdescribe単位になる。

describe "レベル1" do
  before(:all) do; p "レベル1 before(:all)"; end
  before       do; p "レベル1 before";       end
  
  describe "レベル2-1" do
    before(:all) do; p "レベル2-1 before(:all)"; end
    before       do; p "レベル2-1 before";       end

    it "レベル2-1のit-1" do; p "レベル2-1のit-1"; end
    it "レベル2-1のit-2" do; p "レベル2-1のit-2"; end

    after       do; p "レベル2-1 after";       end
    after(:all) do; p "レベル2-1 after(:all)"; end
  end

  describe "レベル2-2" do
    before(:all) do; p "レベル2-2 before(:all)"; end
    before       do ; p "レベル2-2 before";      end

    describe "レベル3-1" do
      before(:all) do; p "レベル3-1 before(:all)"; end
      before       do; p "レベル3-1 before";      end

      it "レベル3-1のit-1" do; p "レベル3-1のit-1"; end
      it "レベル3-1のit-2" do; p "レベル3-1のit-2"; end

      after       do; p "レベル3-1 after";       end
      after(:all) do; p "レベル3-1 after(:all)"; end
    end

    it "レベル2-2のit-1" do; p "レベル2-2のit-1"; end
    it "レベル2-2のit-2" do; p "レベル2-2のit-2"; end

    after       do; p "レベル2-2 after";       end
    after(:all) do; p "レベル2-2 after(:all)"; end
  end

  after       do; p "レベル1 after";       end
  after(:all) do; p "レベル1 after(:all)"; end
end

これを実行すると、こうなる。

レベル1 レベル2-1
"レベル1 before(:all)"
  "レベル2-1 before(:all)"
"レベル1 before"
  "レベル2-1 before"
  "レベル2-1のit-1"
  "レベル2-1 after"
"レベル1 after"
- レベル2-1のit-1

"レベル1 before"
  "レベル2-1 before"
  "レベル2-1のit-2"
  "レベル2-1 after"
"レベル1 after"
- レベル2-1のit-2

  "レベル2-1 after(:all)"
"レベル1 after(:all)"

レベル1 レベル2-2
"レベル1 before(:all)"
  "レベル2-2 before(:all)"
"レベル1 before"
  "レベル2-2 before"
  "レベル2-2のit-1"
  "レベル2-2 after"
"レベル1 after"
- レベル2-2のit-1

"レベル1 before"
  "レベル2-2 before"
  "レベル2-2のit-2"
  "レベル2-2 after"
"レベル1 after"
- レベル2-2のit-2

  "レベル2-2 after(:all)"
"レベル1 after(:all)"

レベル1 レベル2-2 レベル3-1
"レベル1 before(:all)"
  "レベル2-2 before(:all)"
    "レベル3-1 before(:all)"
"レベル1 before"
  "レベル2-2 before"
    "レベル3-1 before"
    "レベル3-1のit-1"
    "レベル3-1 after"
  "レベル2-2 after"
"レベル1 after"
- レベル3-1のit-1

"レベル1 before"
  "レベル2-2 before"
    "レベル3-1 before"
    "レベル3-1のit-2"
    "レベル3-1 after"
  "レベル2-2 after"
"レベル1 after"
- レベル3-1のit-2
    "レベル3-1 after(:all)"
  "レベル2-2 after(:all)"
"レベル1 after(:all)"