0

我有瞳孔模型。所以我可以保存和編輯瞳孔。學生has_one 電話(和手機belongs_to學生)和應用程序通過嵌套屬性保存與他們的手機的學生。一切工作在瀏覽器非常好,但當我嘗試測試更新瞳孔模型我得到一些麻煩。Rails Rspec - 表格的一部分沒有出現在集成測試中(不是渲染fields_for)

控制器

class PupilsController < ApplicationController 
    ... 

    def edit 
    @pupil = Pupil.find(params[:id]) 
    end 

    def update  
    pupil = Pupil.find(params[:id]) 

    if pupil.update_attributes(params[:pupil]) 
     redirect_to pupils_path 
     ... 
    else 
     redirect_to edit_pupil_path 
     ... 
    end 
    end 
end 

查看爲編輯頁面:

<%= form_for @pupil, :html => {:class => "form-horizontal"} do |f| %> 
    <%= field_set_tag do %> 
    ... 
    <div class="control-group"> 
     <%= f.label :pupil_address_of_living, "Address of living", :class => "control-label" %> 

     <div class="controls"> 
     <%= f.text_area :pupil_address_of_living, :rows => 3, 
         :placeholder => @everpresent_field_placeholder %> 
     </div> 
    </div> 

    <hr/> 

    <%= f.fields_for :pupil_phone do |pp| %>            
     <div class="control-group"> 
     <%= pp.label :pupil_home_number, "Home phone", :class => "control-label" %> 

     <div class="controls"> 
      <%= pp.text_field :pupil_home_number, :placeholder => @everpresent_field_placeholder %> 
     </div> 
     </div> 
     ... 
    <% end %> 


    <%= f.submit "Change", :class => "btn btn-large btn-warning" %> 
    <% end %> 
<% end %> 

集成測試這實際上是失敗:

# encoding: UTF-8 
require 'spec_helper' 

describe "SchoolHeads" do 
    before(:each) do 
    @attr = { 
       :user_login => "iSchool_head", 
       :password => "foobar" 
      } 

    user = User.new(@attr) 
    user.user_role = "school_head" 
    user.save! 
    end 

    ... 
    describe "Updating" do 
     describe "View" do 
     before(:each) do 
      @ipupil = Factory(:pupil, :pupil_phone => Factory(:pupil_phone))    
      visit edit_pupil_path(:id => @ipupil.id) 
     end 

     it "should have values in forms" do  
      response.should have_selector("form") do |form| 
      ... 
      form.should have_selector("input", :name => "pupil[pupil_phone_attributes][pupil_home_number]") 
     end 
     end 
    end 

錯誤從我測試

Failure/Error: form.should have_selector("input", 
expected following output to contain a <input name='pupil[pupil_phone_attributes][pupil_home_number]'/> tag: 

<form accept-charset="UTF-8" action="/pupils/220" class="form-horizontal" id="edit_pupil_220" method="post"> 
    <div style="margin:0;padding:0;display:inline"> 
    <input name="utf8" type="hidden" value="✓"><input name="_method" type="hidden" value="put"> 
    </div> 
    <fieldset> 
    ...  
    <div class="control-group"> 
     <label class="control-label" for="pupil_pupil_address_of_living">Address of living</label> 
     <div class="controls"> 
     <textarea cols="40" id="pupil_pupil_address_of_living" name="pupil[pupil_address_of_living]" rows="3">Moscow</textarea> 
     </div> 
    </div> 

    <hr> 

    # Here i should have part of form with phones which is not rendering. 

    <input class="btn btn-large btn-warning" name="commit" type="submit" value="Change"> 
    </fieldset> 
</form> 

我從來沒有遇到過這樣奇怪的問題。它是錯誤還是什麼?這是我的錯誤嗎?

+1

發表評論,因爲我不完全確定。我認爲這可能是因爲當你創建'@ ipupil'時,關係沒有被正確設置。如果用@ipupil = Factory(:pupil)和Factory(:pupil_phone,:user => @ipupil)替換'@ipupil = Factory(:pupil,:pupil_phone => Factory(:pupil_phone))'測試通過了嗎? – pjumble 2012-04-15 10:55:14

+0

@pjumble你的建議對我來說不起作用,但是你讓我的想法如何解決這個問題。另外,你的想法是絕對正確的 - 關係不正確。你可以發佈我現在可以使用的代碼嗎,所以我可以儘可能多地感謝你? 代碼: '之前(:每個)做 @ipupil = FactoryGirl.create(:瞳孔) @attr_pupil_phones = { :pupil_home_number => 「8903111111」, :pupil_mobile_number => 「777-33-22」 } @ ipupil.create_pupil_phone(@attr_pupil_phones) ... end' – ExiRe 2012-04-15 11:06:08

回答

0

我解決了這個問題。非常感謝pjumble誰發現了這個問題。問題在於工廠沒有正確設置關係。所以我改變了這個代碼:

before(:each) do 
    @ipupil = FactoryGirl.create(:pupil) 
    @attr_pupil_phones = { :pupil_home_number => "8903111111", 
         :pupil_mobile_number => "777-33-22" } 
    @ipupil.create_pupil_phone(@attr_pupil_phones) 
    ... 
end 

現在它的工作。