我正在編寫測試以更新我的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文件在關聯方面是正確的。一如既往,任何幫助將不勝感激。謝謝!!
錯誤消息告訴您「@picture」在您的更新方法中爲零。現在你需要知道「@picturable」是否是你認爲的。如果這是我的錯誤,我會查看test.log來檢查sql,然後啓動調試器並在load_picturable方法中設置斷點。 – Meier