スペック内のほんの一握りの例にのみ必要な高価なテスト設定があり、必要に応じて一度実行するだけで済みます。遅いので、before(:each) ブロックに入れないようにしていますが、before(:all) は私のニーズに合わないようです。複雑な要因は、他の一般的なセットアップの後に高価な部分を実行する必要があることだと思います。(これは、検索エンジンを備えたアプリのカピバラ テストです。いくつかのレコードを作成した後、検索結果を取得するためにテスト データベースにインデックスを付ける必要があります。)私の設定は次のとおりです。
feature 'some particular feature' do
before(:each) do
# a bunch of common test setup (creating records that this test will use)
end
describe 'simple example #1' do
# a simple example that doesn't need the expensive setup
end
.
.
.
describe 'simple example #N' do
# a simple example that doesn't need the expensive setup
end
describe 'a more complicated example' do
before(:all) do
# expensive_setup that depends on the records created above
end
it 'does something' do ... end
it 'does something else' do ... end
.
.
.
it 'even does this' do ... end
end
end
問題は、rspec が のコンテキストでサンプルを実行している場合more complicated example
、ブロックが依存するブロックの前before(:all)
に実行されることです。これまでのところ、高価なセットアップをブロックではなくブロックに配置する必要がありました。これは、そのサンプル内のブロックごとに高価なセットアップを実行する必要があることを意味します。これを行うより良い方法はありますか?before(:each)
before(:each)
before(:all)
it
更新: コストのかかる操作の結果がデータベースのみに依存することは言及しませんでした。したがって、各例は同じデータベース設定を使用するため、コストのかかる操作の結果を各例で安全に再利用できます。また、結果はファイルシステムに存在するため、サンプル間でクリアされません。
私は、結果が良好であり、再計算する必要がないことを示す何らかのマーカーをファイルシステムに配置することを考えています。