2013-06-19 47 views
0

我有这样的自定义的验证方法,确保您不能在自己的内容投票,它会导致相当多的RSpec的测试失败,undefined method 'user_id' for nil:NilClassRspec的测试失败使用自定义模型验证

有没有一种办法重写自定义验证,或者使用本地rails验证?

failing tests 
    12) Vote votable type 
     Failure/Error: @vote = FactoryGirl.create(:vote) 
     NoMethodError: 
      undefined method `user_id' for nil:NilClass 
     # ./app/models/vote.rb:18:in `ensure_not_author' 
     # ./spec/models/vote_spec.rb:5:in `block (2 levels) in <top (required)>'  
    validate :ensure_not_author 

vote.rb

attr_accessible :value, :votable_id, :votable_type 
    belongs_to :votable, polymorphic: true 
    belongs_to :user 

def ensure_not_author 
    votable = self.votable_type.downcase 
    errors.add(:user_id, "You can't vote on your own content.") if self.votable.user_id == self.user_id 
    end 

如果有人需要更多的代码就骂

回答

2

它看起来像self.votable为零。看来这个测试应该从投票的角度来看待投票。如果是这样的话,那么在工厂里为投票创建投票并将测试移动到您的投票实体的套件中,因为您真的在测试投票人不应该对自己的内容进行投票。