【问题标题】:Running custom validations with gem specific methods使用特定于 gem 的方法运行自定义验证
【发布时间】:2015-10-07 13:59:08
【问题描述】:

我设置了一个自定义验证,用于在提交评论之前检查用户是否为专辑投票。验证在客户端运行良好,但在运行我的 Rspec 测试时,我似乎遇到了一些问题。

验证使用 Acts As Votable gem 的 voted_for? 方法。不幸的是,这就是事情变得糟糕的地方。对于我的非自定义验证(顺便说一句,它经常工作)我收到这样的错误:

  3) Review validations should ensure body has a length of at least 40
     Failure/Error: it { should validate_length_of(:body).is_at_least(40) }
     NoMethodError:
       undefined method `voted_for' for nil:NilClass

我需要做什么才能识别此方法?

审查模型

class Review < ActiveRecord::Base
  belongs_to :album
  belongs_to :owner, class_name: "User", foreign_key: :user_id

  validates :body, presence: true, length: { minimum: 40 }

  def album_vote
    if !owner.voted_for?(album)
      errors.add(:review, "requires an album vote before submitting")
    end
  end
end

审核工厂

FactoryGirl.define do
  factory :review do
    body { Faker::Lorem.paragraph(2) }

    album
    association :owner, factory: :user
  end
end

【问题讨论】:

    标签: ruby-on-rails validation rspec tdd factory-bot


    【解决方案1】:

    您需要确保确实存在所有者。该错误只是因为您调用的是 nil 并且与 ActsAsVotable 没有任何关系。

    class Review < ActiveRecord::Base
      belongs_to :album
      belongs_to :owner, class_name: "User", foreign_key: :user_id
      validates :body, presence: true, length: { minimum: 40 }
      validates :owner, presence: true
    
      def album_vote
        # consider raising an error if there is no owner.
        if owner && !owner.voted_for(album)
          errors.add(:review, "requires an album vote before submitting")
        end
      end
    end
    

    然后更改您的工厂定义以创建所有者:

    FactoryGirl.define do
      factory :user, aliases: [:owner] do
        # ...
      end
    end
    
    FactoryGirl.define do
      factory :review do
        body { Faker::Lorem.paragraph(2) }
        album
        owner
      end
    end
    

    【讨论】:

    • 该错误也可能与您在测试中调用工厂的方式有关。
    • 是的,它看起来需要在条件中检查预先存在的owner。谢谢麦克斯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多