2016-03-04 48 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