2012-01-18 52 views
0

下面是創建RFQ控制器:如何RSPEC在加入記錄多到許多在軌3.1.0

def create 
    if has_create_right? 
     @rfq = Rfq.new(params[:rfq], :as => :roles_new) 
     #save into join table rfqs_standards 
     params[:rfq][:standard_ids].each do |sid| 
     @rfq.standards << Standard.find(sid.to_i) if !sid.nil? 
     end 
    if @rfq.save 
     redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!") 
     else 
     flash.now[:error] = "RFQ not saved!" 
     render 'new' 
     end 
    end 
    end 

這裏是RSpec的代碼

describe "'create'" do 
    it "should be successful for corp head" do 
     session[:corp_head] = true 
     session[:user_id] = 1 
     s = Factory(:standard) 
     rfq = Factory.attributes_for(:rfq) 
     rfq.standards << s 
     get 'create', :rfq => rfq 
     response.should redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!") 
    end 
    end 

的錯誤是:

1) RfqsController 'create' should be successful for corp head 
    Failure/Error: rfq.standards << s 
    NoMethodError: 
     undefined method `standards' for #<Hash:0x6741570> 
    # ./spec/controllers/rfqs_controller_spec.rb:65:in `block (3 levels) in <top (requi 

什麼是測試連接記錄的正確方法?謝謝。

回答

1

從你的這部分測試:

rfq = Factory.attributes_for(:rfq) 
    rfq.standards << s 

它似乎是詢價創建爲屬性哈希,而不是一個完整的模型。您可以嘗試加入standard_ids這樣的:

describe "'create'" do 
    it "should be successful for corp head" do 
    session[:corp_head] = true 
    session[:user_id] = 1 
    s = Factory(:standard) 
    rfq = Factory.attributes_for(:rfq) 
    rfq[:standard_ids] = [s.id] # attach standard_id's to mimic the POST'ed form data 
    get 'create', :rfq => rfq 
    response.should redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!") 
    end 
end 

然而,似乎可以完成這一切的使用嵌套的屬性 - 見http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

+0

應用程序有沒有問題,保存到連接表時,一個新的RFQ被保存。現在的問題是如何rspec它。這裏是一篇關於如何保存到連接表的文章 - http://stackoverflow.com/questions/8736805/how-to-save-2-id-in-joint-table-for-many-to-many-relationship-在護欄-3-1。 – user938363 2012-01-18 16:42:11

+0

同意,但我上面發佈的代碼不是如何保存模型,而是如何解決您的RSpec測試(我已更新,以使其更清楚)。關於嵌套屬性的評論只是對你如何實現保存加入模型的評論/建議。對於一個habtm關係來說,你是正確的,嵌套屬性不會起作用,但是你不清楚你是在談論你的OP中的一個壞習慣。 – PinnyM 2012-01-18 23:00:35

+0

剛剛經過測試並失敗。錯誤是:失敗/錯誤:get'create',:rfq => rfq NoMethodError: 當你沒有想到它時,你有一個零對象!問題似乎是相同的,這是rfq(attributes_for)不是一個對象。在rails控制檯中,如果將rfq作爲對象進行創建,那麼將執行rfq.standards << s而不會出錯。創建代碼似乎可以創建一個新的rfq。但是rspec代碼失敗。現在確定rfq.new(params [:rfq])如何在控制器執行過程中被視爲rfq對象。不管怎麼說,還是要謝謝你。 – user938363 2012-01-19 03:48:07