标签:
(1)FactoryGirl.attributes_for(:contact)生成hash
(2)assigns(:variable_name)方法,可以理解为接受action处理后放回的@variable_name赋值给一个局部变量
(3)控制器测试的关键点:
(1)测试GET请求的动作(index、show、new、edit):返回值是否是我们期待的(expect(assigns(:variable_name)).to eq variable,当返回值是一个数组并且不要求数组顺序时用match_array(array),要求顺序用eq;期待返回是一个新对象可以用be_a_new(Class));渲染的页面是不是我们期待的(expect(response).to render_template :action);例:
describe ‘GET #show‘ do it ‘assigns the requested contact to @contact‘ do contact = create(:contact) #FactoryGirl.create(:contact)缩略形式 get :show, id: contact expect(assigns(:contact)).to eq contact end it ‘renders the :show template‘ do contact = create(:contact) get :show, id: contact expect(response).to render_template :show end end
(2)测试POST请求(create):和GET请求思路相似,只是参数需要Hash,需要使用attributes_for(),还需要分为参数合法以及不合法两种情况,create成功期待数据条数变化,例:
expect{ post :create, contact: attributes_for(:contact) }.to change(Contact, :count).by(1)
将HTTP请求放入expect块中,是为了延迟执行,检测的值会在请求执行前后执行两次,来验证变化
(3)测试PATCH请求(update):分为参数合法与不合法两种情况,分别验证返回数据是否有,以及是否修改成功,以及渲染的模板;
(4)测试DELETE请求(destroy):change(Class, :count).by(-1),redirect_to
(5)测试非CRUD动作:有返回值验证返回值,或验证数据条数变化;验证render页面
(6)测试不输出HTML的控制器:可以验证响应头的Content-Type(expect(response.headers[‘Content-Type‘]).to have_content ‘text/csv‘);可以验证相应体是否含有特定的内容(expect(response.body).to have_content ‘‘);have_content是Capybara提供的方法,也可以使用rails-rspec提供的match()参数为正则表达式
标签:
原文地址:http://my.oschina.net/u/1413049/blog/398480