我正在编写测试以更新我的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