文章是从我的个人博客上粘贴过来的,
大家也可以访问 www.iwangzheng.com
今天有两个单元测试一直跑不通,究其原因是没搞清楚单元测试的传参的概念,之前大师强调过的,今天pp又讲解了一遍。以第一个单元测试的测试模块的25行为例
25 put :modify, :id => @list.id, :rankinglist => {:title => new_title}
这个报错是因为我写成了list =>{:title => new_title},但是被测模块里是没有这个参数的,想知道有啥就看被测模块 params里面的内容啊,有几个传几个就行。
这个巧合的是我的前端代码是这样的
<%= text_field_tag 'title' ,@rankinglist.title %>由于text_field_tag里的内容在html里解析为id=‘title’,name ='title',所以在25行里没有:title也是ok的
23def modify
24 @rankinglist.title = params[:title]25 if @rankinglist.update_attributes(params[:rankinglist])26 redirect_to edit_tv_i_rankinglist_path(:id => @rankinglist.id) , :notice => '操作成功'27 else28 render :action => "edit"29 end30 end
对应的单元测试
23it 'should put update' do
24 new_title = 'test'25 put :modify, :id => @list.id, :rankinglist => {:title => new_title}26 @list.reload.title.should == new_title27 end
再来看第二个写错的单元测试
5def index
6 @module_type = params[:module_type]7 @rankinglists = CmsTvRankingList.where('state = ? ', 1)8 @rankinglist = CmsTvRankingList.find_by_id(params[:rankinglist_id]) || @rankinglists.try(:first)9 @modules = CmsTvRankingListModule.where('rankinglist_type = ? ', @rankinglist.id).order(:position)10 end对应的单元测试
5before do
6 admin_login7 request.env["HTTP_REFERER"] = root_path8 @rankinglist = CmsTvRankingList.create(:title =>'5' ,:state => '1')9 @module = CmsTvRankingListModule.create(:title => '测试', :rankinglist_type => 5)10 end11 it 'should get index' do12 get :index, :rankinglist_id =>'1'13 response.should be_success14 end错在哪里呢,由于这个排行榜子菜单是在排行榜菜单内部的,所以是需要先保证被测的第8行是有值的,所以需要写上测试里的第8行,当然,测试的12行后半句也是必要的。