2013-06-25 65 views
0

我有這個控制器spec文件。rspec shared_examples_for方法

describe BriefNotesController do 
    render_views 

    before(:all) do 
    @customer=Factory(:customer) 
    @project=Factory(:project_started, :owner => @customer) 
    end 

    context 'get :new' do 

    it 'should redirect to login page for not signed in users' do 
     get :new, :project_id => @project.id 
     response.should new_user_session_path 
    end 


    end 

    context 'get :create' do 

    it 'should redirect to login page for not signed in users' do 
     post :create, {:project_id => @project.to_param, :brief_note => Factory.attributes_for(:brief_note, :project_id => @project.id)} 
     response.should redirect_to new_user_session_path 
    end 
end 

在這些測試中,我重複同樣的驗證測試每個動作,因此我想用幹way.I重新編寫它試圖與shared_examples_for方法重新編寫這個測試,但我沒有用它處理。

回答

0

像這樣的東西可以工作

shared_examples_for 'redirects to login page if not signed in' do 

    context 'get :new' do 
    it 'should redirect to login page for not signed in users' do 
     get :new, :project_id => resource.id 
     response.should redirect_to new_user_session_path 
    end 
    end 

    context 'get :create' do 
    it 'should redirect to login page for not signed in users' do 
     post :create, resource_params 
     response.should redirect_to new_user_session_path 
    end 
    end 
end 

你會使用這樣的:

describe BriefNoteController do 
    let(:customer) { Factory(:customer) } 
    let(:project) { Factory(:project_started, :owner => customer) } 

    let(:resource) { project } 
    let(:resource_params) do 
    { 
     :project_id => project.to_param, 
     :brief_note => Factory.attributes_for(:brief_note, :project_id => project.id) 
    } 
    end 

    it_behaves_like 'redirects to login page if not signed in' 
end