2013-01-18 38 views
0

通常在我的控制器的規格,我會做這樣的事情:DRY rspec的語法控制器規格

describe MyController do 
    describe 'POST #create' do 
    let!(:my_model) { initialize_something_here } 

    before :each do 
     post :create, my_model: my_model 
    end 

    it 'should be successful' do 
     response.should be_successful 
    end 

    ... more tests ... 
    end 
end 

我的問題是,當我這樣做,使用expect塊,如檢查斷言的項目數在數據庫中一個create後遞增,我必須從before :each塊取出post呼叫,像這樣重複它爲每個it聲明:

describe MyController do 
    describe 'POST #create' do 
    let!(:my_model) { initialize_something_here } 

     it 'should insert into database' do 
     expect { post :create, my_model: my_model }.to change(MyModel, :count).by(1) 
     end 

     it 'should be successful' do 
     post :create, my_model: my_model 
     response.should be_successful 
     end 

     ... more tests ... 
    end 
    end 

是否有DRY-ER方式打電話給post

回答

2

我相信你可以使用了lambda也許在一個讓

let(:post_create_model) { -> { post :create, my_model }} 

    it 'should insert into database' do 
    expect(post_create_model).to change(MyModel, :count).by(1) 
    end 

    it 'should be successful' do 
    post_create_model.call 
    response.should be_successful 
    end 
+0

我想可以工作......我希望有一個更簡潔的或內置的方式做這樣的事情。 –

+0

好的提示!雖然可能是期望應該是這樣的:'expect(post_create_model).to改變...'(注意括號)? – Philipp