【问题标题】:Shoulda Matchers attempting to insert `nil` value while validating uniqueness应该在验证唯一性时尝试插入“nil”值的匹配器
【发布时间】:2016-01-13 19:35:28
【问题描述】:

我有跟踪推荐的Referral 模型(即当社交媒体网站上的用户生成唯一的推荐/邀请链接并邀请其他人加入应用时)。

  • Referrer - 发送独特邀请链接的人
  • Referree - 接收并使用该链接进行注册的人

我的型号和规格如下所示

型号

# app/models/referral.rb

class Referral < ActiveRecord::Base
  # A referral has one user who refers and one user who is being referred. Both are User models.
  belongs_to :referrer, class_name: "User", foreign_key: "referrer_id"
  belongs_to :referree, class_name: "User", foreign_key: "referree_id"

  # Validate presence - don't allow nil
  validates :referrer_id, presence: true
  validates :referree_id, presence: true

  # Referrers can have multiple entries, must be unique to a referree, since they can 
  # only refer someone once. 
  # Referees can only BE referred once overall, so must be globally unique
  validates :referrer_id, uniqueness: { scope: :referree_id }
  validates :referree_id, uniqueness: true
end

规格

# spec/models/referral_spec.rb
require "spec_helper"

RSpec.describe Referral, type: :model do
  describe "Associations" do
    it { should belong_to(:referrer) }
    it { should belong_to(:referree) }
  end

  describe "Validations" do
    it { should validate_presence_of(:referrer_id) }
    it { should validate_presence_of(:referree_id) }

    it { should_not allow_value(nil).for(:referrer_id) }
    it { should_not allow_value(nil).for(:referree_id) }

    # These two FAIL
    it { should validate_uniqueness_of(:referrer_id).scoped_to(:referree_id) }
    it { should validate_uniqueness_of(:referree_id) }
  end
end

我的问题是最后两个规范测试总是失败,比如

1) Referral Validations should require case sensitive unique value for referrer_id scoped to referree_id
   Failure/Error: it { should validate_uniqueness_of(:referrer_id).scoped_to(:referree_id) }
   ActiveRecord::StatementInvalid:
     PG::NotNullViolation: ERROR:  null value in column "referree_id" violates not-null constraint
     DETAIL:  Failing row contains (1, 2016-01-13 19:28:15.552112, 2016-01-13 19:28:15.552112, 0, null).
     : INSERT INTO "referrals" ("referrer_id", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"

看起来shoulda 匹配器正在尝试在其中插入nil 值,同时测试各种值。玩allow_niltruefalse 并没有解决它。

知道为什么它会在那里绊倒吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails activerecord shoulda


    【解决方案1】:

    this

    validate_uniqueness_of 匹配器创建一个新实例,如果一个不存在的话。这样做时,它可能会因为其他领域的模型验证而失败。在您的情况下,在验证 referer_id 的唯一性时,referree_id 中的值为零,因此失败。

    解决方案是创建一个实例并将值分配给引发 ERROR: null value in column 的属性。

    同样,请参考第一行的链接示例和详细说明

    【讨论】:

    • 完美!那是确切的问题,谢谢:) 作为记录,我使用subject { create(:referral) } 使用FactoryGirl 工厂创建Referral,并预先填充referrerreferrer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多