2009-07-16 12 views
3

私はレールアプリケーションプログラミングで非常に便利だとわかったトリックは、その場でメソッドを作成するためにclass_evalを使うことができるということです。私は今テストに着手し始めており、同様のアイデアがテストを生成するために使用できるのだろうかと思います。レールでテストを動的に生成することは可能ですか?

たとえば、私はbefore_filterを持っていて、ユーザーがコントローラ内のすべてのアクションにログインするように要求しています。 before_filterがすべてのアクションに適用されていることを確認するテストを作成したいと思います。個々のテストを個別に書き出す代わりに、これらのテストを自動的に生成したいと考えています。

このタイプのテストはお勧めですか、個別にテストを書くことに固執すべきですか?そうであれば、どうやってそうするのだろう?

EDIT:それは一度だけ実行されますように、私はこのようなコードのブロックを置く今、人々はこれが有用であることを確認したことを

actions = {:index => :get,:show => :get,:edit => :get,:update => :put} 
actions.each_pair do |action,type| 
    class_eval(%Q{def test_user_required_for_#{action} 
     set_active_user users(:one) 
     #{type} :#{action} 
     assert flash[:error] 
     assert_redirected_to :action => :index 
    end 
    }) 
end 

、これは次のようになりますこれらのテストを作成するには?

+1

'class_eval'の文字列形式を使用しないようにしてください。あなたが 'class_eval'を使う必要があるなら(それはしばしば必要ではありません)、ブロックフォームを使います。それはより安全です。 –

答えて

3

DRYの原則は、アプリケーションコードに適用されるのと同じくらいテストコードに適用されます。

これらのテストをすべて生成する方法が1つあれば、テストが正しいことを最初に確認することが容易になります。

コメントに答えるには(私はしばらくのうちにRailsテストコードを書いていないので、おそらく100%正しいとは限りません)。 %| |の間のすべてが大きな文字列です。

MyControllerTest 

    [:index, :show, :new, :create, :edit, :update, :destroy].each do |action| 
     class_eval do %| 
     test "#{action} requires before filter" do 
      #test #{action} code here 
     end 
     | 
    end 

end 
+0

どのようにしてこれらのテストを作成するのですか? –

+0

これらのテストを設定するために、このコードを一度だけ実行するようにこのコードを置くことはできますか? –

+0

これは、あなたがテストしたいコントローラに属します。たとえば、AccountsControllerがロックダウンされていることを確認したい場合、コードはaccounts_controller_test.rbファイルに格納されます。 – erik

0

一般的に、テストを個別に書きます。しかし、同じテストがたくさんある場合は、あなたが持っているようなブロックをeachから生成するのに間違いはありません。

ボーナスチップ:Test :: UnitではなくRSpecを使用してください。一般的にはより良いことに加えて、あなたがやっていることがずっと楽になります。

+0

rspecとtest-unitの使いやすさは、個人的な好みの問題です。私は個人的には、私が思うようにtest :: unit(+ shoulda)をもっと簡単に、より自然に見つけることができます。これはYMMVの話題です:) –

+0

@TarynEastこれは、味の問題ではなくなりました。RSpecの 'should'構文は、あなたが動作について考えることを奨励しますが、Test :: Unitの' assert'構文は実装について考えるよう促します。一般的には、実装ではなく動作をテストする必要があります。なぜなら、*インタフェース*が意図したとおりに動作することを確認することだけに興味があるからです。 Test :: Unitがより自然であると分かった場合、おそらく実装をテストしようとしていることを意味します。つまり、間違ったことをテストしようとしています。 –

+0

@TarynEast私はただ読んで、あなたがShouldaを使っていることに気づいたので、 'should'構文のいくつかを取得します。 RSpecを使うのはなぜですか?あなたはShouldaについてどう思いますか? –