Shoulda Matchers 尝试在验证唯一性时插入“nil”值
Shoulda Matchers attempting to insert `nil` value while validating uniqueness
我有 Referral
跟踪推荐的模型(即当社交媒体网站上的用户生成一个独特的 referral/invite link 并邀请其他人加入该应用程序时)。
- Referrer - 发出独特邀请的人 link
- Referree - 收到并使用 link 注册的人
我的型号和规格如下
型号
# 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 (, , ) RETURNING "id"
看起来 shoulda
匹配器在测试各种值时试图在其中插入一个 nil
值。玩 allow_nil
是 true
和 false
并没有解决它。
知道为什么它会在那里绊倒吗?
谢谢!
见this
validate_uniqueness_of 匹配器创建一个新实例,如果一个不存在的话。这样做时,它可能会因为在其他一些字段上进行模型验证而失败。在您的情况下,在验证 referrer_id 的唯一性时,referree_id 中的值为 nil,因此失败。
解决方案是创建一个实例并为抛出错误的属性赋值:列中有空值。
同样,请参考第一行的link示例和详细说明
我有 Referral
跟踪推荐的模型(即当社交媒体网站上的用户生成一个独特的 referral/invite link 并邀请其他人加入该应用程序时)。
- Referrer - 发出独特邀请的人 link
- Referree - 收到并使用 link 注册的人
我的型号和规格如下
型号
# 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 (, , ) RETURNING "id"
看起来 shoulda
匹配器在测试各种值时试图在其中插入一个 nil
值。玩 allow_nil
是 true
和 false
并没有解决它。
知道为什么它会在那里绊倒吗?
谢谢!
见this
validate_uniqueness_of 匹配器创建一个新实例,如果一个不存在的话。这样做时,它可能会因为在其他一些字段上进行模型验证而失败。在您的情况下,在验证 referrer_id 的唯一性时,referree_id 中的值为 nil,因此失败。
解决方案是创建一个实例并为抛出错误的属性赋值:列中有空值。
同样,请参考第一行的link示例和详细说明