2011-01-09 1 views
2

私はRuby on Rails 3 admin_controllerをデフォルトのCRUD、インデックスなどのメソッドで設定しています。私はrspecで特定のアサーションについてこれらのそれぞれをテストしたいと思います。コントローラの各メソッドを動的にテストする

response.should render_template("layouts/some_layout")に似ているか、ログインする必要があることをテストします。

各テストのテストグループにそのテストをコピーして貼り付けることは、重複しています。 IMOそれはほとんど意味がない

it 'should require login' do 

このテストでは何度も重複しています。

メソッドのリストに対して簡単なテストを実行する方法はありますか?いくつかの並べ替えのdefined_methods.each do |method| it 'should' ....と言う?

これは最初の良い方法ですか?それとも、私は間違ったルートを最初に取っていますか?

答えて

1

、あなたのような何かを行うことができます:、私は共有の例のグループを考えるしかし

SomeController.public_instance_methods(false).each do |method| 
    it "should do something" 
end 

を(この下半分の方法についての参照ページ:http://rspec.info/documentation/)がきれいになります。それはすべてあなたのコントローラの仕様にまたがって使用することができるよう、それが抽出された場合は、それもよりよいだろう。..

shared_examples_for "admin actions" do 
    it "should require login" 
end 

次に、各コントローラの仕様で:

describe SomeController do 
    it_should_behave_like "admin actions" 
end 
0

ちょうどあなたのtest_helper.rbに追加し、のようなもの:

はDEFあなたはshared example groupsと考えている、あなたが本当にこれらすべてのアサーションをしたいことを考えると ... エンド

2

をrequires_login?それはすでにそれが処理される場合には、例えばレンダリングされたテンプレートをチェックする(機能を提供しているライブラリによってテストされていない場合は、必ずチェックすべき基本的な機能のためのスペックを大量に書き込む前にもちろん

shared_examples_for "an action that requires authentication" do 
    it "should render successfuly" do 
    sign_in(user) 
    response.should be_success # or whatever 
    end 

    it "should deny access" do 
    # don't sign_in the user 
    # assert access was denied 
    end 
end 

shared_examples_for "another behaviour" do 
    # ... 
end 

let(:user) { create_user } 

describe "#index" do 
    before(:each) { get :index } 
    it_behaves_like "an action that requires authentication" 
    it_behaves_like "another behaviour" 
end 

describe "#show" do 
    before(:each) { get :show } 
    it_behaves_like "an action that requires authentication" 
end 

# ... 

レールの暗黙のレンダリングによって、少し過度のものかもしれません)。あなたが繰り返しコントローラ内の各パブリックメソッドをテストするためのルートを下るしたい場合

関連する問題