読者です 読者をやめる 読者になる 読者になる

RSpec で pending しても before :context が呼ばれてしまう

結果だけ先に書いてしまいますが『pending しているスコープで before :context を定義すると before のブロックが呼ばれます』。
どういうことかというと次のように before :context 内で例外が発生した場合、テストが失敗してしまいます。

describe X do
    # 以下のブロックを pending にする
    xcontext 'hoge' do
        # pending しているのにもかかわらず it 時に before のブロックが呼ばれてしまう
        before :context do
            raise "error"
        end
        it { expect(0).to eq 0 }
    end
end

これは pending してるのにもかかわらず before:context を指定した場合、it 時にブロック内の処理が呼ばれてしまうためです。
また、この問題(というべきかはわかりませんが)は :context を渡した時のみ発生し、引数を渡さなかったり :example を渡した場合には再現しません。
ちなみに :all:contextエイリアスなので :all を渡しても同様の問題が発生します。

どういう時に困るのか

例えば、次のように before 内で実装する予定のメソッドを呼び出していると例外が発生するのでテストが失敗してしまいます。

describe X do
    # X.hoge を後で実装する
    xcontext '.hoge' do
        before :context do
            # この段階では .hoge は未実装
            @result = X.hoge
        end
        it { expect(@result).to eq "hoge" }
        it { expect(@result).to be_kind_of String }
    end
end

こういう場合は before :context を使わなかったり、before 以外(subject など)を使用して回避する必要があります。

[関連]

https://github.com/rspec/rspec-core/issues/107

[追記]

書き忘れてましたが RSpec のバージョンは 3.6.0 です。