5

スペック内のほんの一握りの例にのみ必要な高価なテスト設定があり、必要に応じて一度実行するだけで済みます。遅いので、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

更新: コストのかかる操作の結果がデータベースのみに依存することは言及しませんでした。したがって、各例は同じデータベース設定を使用するため、コストのかかる操作の結果を各例で安全に再利用できます。また、結果はファイルシステムに存在するため、サンプル間でクリアされません。

私は、結果が良好であり、再計算する必要がないことを示す何らかのマーカーをファイルシステムに配置することを考えています。


4

2 に答える 2

0

一般的なセットアップのダイジェストを計算し、それを高価な操作の結果とともに保存することで、問題を回避することになりました。高価な操作を行う前に、現在のダイジェストがディスク上のダイジェストと一致するかどうかを確認してください。もしそうなら、それをする必要はありません。すべての例が共通のセットアップを共有しているため、コストのかかる操作は多くても 1 回しか実行されません。

于 2012-05-09T22:16:01.267 に答える