2013-01-18 40 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