ブログ記事からの転載です。
結果だけ先に書いてしまいますが『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 です。