6

同じスペックコンテキストで複数のgetを実行する必要がある場合、コントローラースペックに各getの前にインスタンス変数スペースを「リセット」する方法はありますか?

テストごとに1つのアサーションのガイドラインを理解しています。ただし、一連のテストの1つでは、各getの前に個別の(長い)before(:each)セットアップを実行せず、単一のコンテキストで一連のget / assertを一緒に実行すると、約3倍高速に実行されます。 。

ただし、(ブラウザを介してコントローラメソッドが呼び出される場合とは異なり)rspecを使用して2つの連続したgetを実行すると、各getでインスタンス変数がクリアされないため、データのクロスオーバーが発生する可能性があります。

これは失敗したテストであり、別のコントローラーメソッド「vartest2」が実行されたときに「vartest1」に設定された変数がまだ存在していることを示しています。

コントローラのメソッド:

  def vartest1
    @this_var = "foo" 
    render :text => @this_var
  end

  def vartest2
    render :text => @this_var # should be EMPTY!
  end

Rspecコントローラーの仕様:

  describe "instance variable crossover example", :focus => true do
    describe "THIS PASSES put each get in separate contexts" do
      it "vartest1 outputs foo" do
        get "vartest1"
        response.body.should include("foo")
      end
      it "vartest2 does NOT output foo" do
        get "vartest2"
        response.body.should_not include("foo")
      end
    end
    describe "THIS FAILS put both gets in SAME context" do
      it "should not crossover controller instance varables" do
        get "vartest1"
        response.body.should include("foo")
        get "vartest2"
        response.body.should_not include("foo") # THIS FAILS
      end
    end
  end

Rspecの結果:

 instance variable crossover example
    THIS PASSES put each get in separate contexts
      vartest1 outputs foo
      vartest2 does NOT output foo
    THIS FAILS put both gets in SAME context
      should not crossover controller instance varables (FAILED - 1)

失敗したテストで起こっていることは、rspecがget 'vartest1'コントローラーメソッドを実行するとインスタンス変数を'foo'に設定し、rspecが実行get 'vartest2'するとインスタンス変数(nilである必要があります)がまだ設定されているため、テストが失敗することです。

4

1 に答える 1

2

コントローラの仕様は単体テストです。すべての単体テストと同様に、メソッドを個別にテストする必要があります。コントローラの場合、これは各アクションに独自の仕様が必要であることを意味します。コントローラ仕様で複数のリクエストを実行しても、どこにも到達しない可能性があります。

リクエストスペック、またはキュウリの使用を検討してください。環境によっては、セットアップは例ごとに1回だけ実行する必要があるため、これにより良い結果が得られる場合があります。次に、複数gets(またはvisits)を実行できます。

もう1つの可能性は、コントローラーの仕様にモック/スタブを使用することです。これにより、追加のセットアップを行う代わりに、パフォーマンスを大幅に向上させることができます。コントローラ仕様のRSpecスキャフォールドの例は、このアプローチの出発点として適しています。

于 2013-01-04T03:12:54.027 に答える