1

次のような仕様ファイルがいくつかあります。

describe "My DSL" do

  before :each do
    @object = prepare_my_object
  end

  describe "foo" do

    before :each do
      @result = @object.read_my_dsl_and_store_stuff_in_database__this_is_expensive
    end

    it "should do this" do
      @result.should be_this
    end

    it "should not do that" do
      @result.should_not be_that
    end

    # ... several more tests about the state of @result
  end

  # ...
end

before :each2 番目のブロックが毎回実行されるため、これらのテストには時間がかかります。代わりに使用before :allしても、アウターの前に呼び出されるため、実際には役に立ちませんbefore :each。すべての期待を 1 つのitブロックにまとめることは役に立ちますが、これは悪いスタイルと見なされます。

高価なメソッドを 1 回だけ実行するベスト プラクティスは何ですか?

4

1 に答える 1

0

rspec を高速化する最速の方法は、データベースを完全に切り離すことです。DSLの問題は、データベースへの入出力の問題とは別の問題です。両方を行う 1 つのメソッドがある場合、そのメソッドを分割することは可能ですか?

理想的には、DSL はローカルにキャッシュされるため、リクエストごとにデータベースから取得する必要はありません。一度メモリにロードされ、リフレッシュする前にそこに保持される可能性があります。

ローカルのメモリ内キャッシュに対して実行し、データベースを分離すると、速度が向上しますか? はいの場合、遅いのは db 呼び出しです。DSL が完全にメモリに読み込まれているのにテストがまだ遅い場合は、DSL 自体に問題があります。

于 2012-11-13T09:45:00.310 に答える