2011-01-09 238 views
2

我有一個Ruby on Rails 3 admin_controller與默認的設置的CRUD,索引等方法。我想用rspec來測試每個這些特定的斷言。動態測試控制器中的每個方法

response.should render_template("layouts/some_layout")或測試,它應該需要登錄。

將該測試複製粘貼到每種方法的測試組中會產生大量重複。國際海事組織是沒有意義的有一個

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中,是這樣的:

高清requires_login ... 結束

2

假設你真的想所有這些說法,你認爲shared example groups

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 

# ... 

當然寫大量規格的一個基本功能,您應經常檢查,如果它是不是已經是一個提供功能(例如檢查所呈現的模板庫中進行測試,如果前辦理通過rails的隱式渲染,可能有點矯枉過正)。

相關問題