2016-03-04 49 views
2

我正在編寫測試以更新我的rails應用程序中的圖像。我的應用中的圖片模型是一個多態關聯,它屬於多個模型。我正在測試集成測試中的創建,更新和銷燬操作工作流程。我已成功測試了創建操作。它的工作正常。我遇到的問題是更新操作。在rails中測試多態關聯

模型與圖片模型的關聯如下。

class Picture < ActiveRecord::Base 
    belongs_to :pictureable, polymorphic: true 

# each user has one picture 
    has_one :picture, as: :pictureable 

#each scoreboard has one picture 
    has_one :picture, as: :pictureable, dependent: :destroy 

picture_update_test的代碼如下所示。

def setup 
    @picture = pictures(:picture_a) #this is the picture associated with pictureable (scoreboard_a) 
    @scoreboard = scoreboards(:scoreboard_a) #pictureable is scoreboard_a 
    end 

    test "successful update where pictureable is scorebaord" do 
    patch scoreboard_picture_path(@scoreboard, @picture), picture: {picture: "blank-prof.jpg"} 
    end 

picture.yml文件中的代碼如下所示。

picture_a: 
    picture: "blank-prof.jpg" 
    pictureable_type: scoreboard 

一旦我運行測試,我得到以下錯誤。

NoMethodError: undefined method `update_attributes' for nil:NilClass 
    app/controllers/pictures_controller.rb:19:in `update' 

圖片控制器代碼也在下面給出。

def update 
    @picture = @pictureable.picture 
    if @picture.update_attributes(picture_params) 
     redirect_to @pictureable 
     flash[:success] = "Picture updated successfully" 
    else 
     redirect_to @pictureable 
     flash[:danger] = "An error occured, please try again!" 
    end 
end 

我發現@pictureable是一個用戶還是記分板,通過拆分url。代碼如下。

def load_pictureable 
    resource, id = request.path.split('/')[1,2] 
    @pictureable = resource.singularize.classify.constantize.find(id) 
end 

我爲該方法運行before_filter。 before_filter :load_pictureable

在測試中,我不需要拆分任何網址。我具體說明了url路徑scoreboard_picture_path或'user_picture_path'。我只需要通過scoreboard_id和picture.id。錯誤狀態爲無類的update_attributes。我真的不知道爲什麼我得到這個錯誤。我不確定如果pictures.yml文件在關聯方面是正確的。一如既往,任何幫助將不勝感激。謝謝!!

+0

錯誤消息告訴您「@picture」在您的更新方法中爲零。現在你需要知道「@picturable」是否是你認爲的。如果這是我的錯誤,我會查看test.log來檢查sql,然後啓動調試器並在load_picturable方法中設置斷點。 – Meier

回答

2

在您的yaml中,您正在設置pictureable_type,但不是picturable_id,因此關聯沒有正確構建。

您可以see the fixtures docs設立態關聯燈具的例子,但基本上不是你在做什麼,你應該能夠做這樣的事情:

picture_a: 
    picture: "blank-prof.jpg" 
    pictureable: scoreboard_a (Scoreboard) 

那麼就應該允許@pictureable.picture返回圖片。

+1

我閱讀文檔。我有一個直覺,我的夾具文件是錯誤的。我知道我必須編輯與圖片相關的圖片。我仍然必須定義pictureable。 pictureable =記分牌(:scoreboard_a)在我的設置。一切正常。非常感謝!!! –

+0

不客氣。 – smathy