ブログ記事からの転載です。
結果だけ先に書いてしまいますが『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 など)を使用して回避する必要があります。
[関連]
[追記]
書き忘れてましたが RSpec のバージョンは 3.6.0 です。