gpt4 book ai didi

rspec - 如何使用 Shoulda 正确检查唯一性和范围

转载 作者:行者123 更新时间:2023-12-04 01:36:54 24 4
gpt4 key购买 nike

我有一个 User 模型,它有一个 items 的子关联。项目的 :name 对用户来说应该是唯一的,但它应该允许不同的用户拥有同名的项目。

Item 模型当前设置为:

class Item < ApplicationRecord
belongs_to :user
validates :name, case_sensitive: false, uniqueness: { scope: :user }
end

这可以验证用户内部,但仍然允许其他用户保存具有相同名称的项目。

如何使用 RSpec/Shoulda 进行测试?

我目前的测试写成:

describe 'validations' do
it { should validate_uniqueness_of(:name).case_insensitive.scoped_to(:user) }
end

但是这个测试失败了,因为:

Failure/Error: it { should validate_uniqueness_of(:name).scoped_to(:user).case_insensitive }

Item did not properly validate that :name is case-insensitively
unique within the scope of :user.
After taking the given Item, setting its :name to ‹"an
arbitrary value"›, and saving it as the existing record, then making a
new Item and setting its :name to a different value, ‹"AN
ARBITRARY VALUE"› and its :user to a different value, ‹nil›, the
matcher expected the new Item to be invalid, but it was valid
instead.

然而,这是我想要的行为(除了应该为用户选择 nil 的奇怪部分)。当用户不同时,同名应该是有效的。

可能是我没有正确使用示波器测试,或者这对于 Shoulda 来说是不可能的,这里是 the description of scoped tests .在这种情况下,您将如何编写模型测试来测试这种行为?

最佳答案

解决这个问题的方法有三个:

  1. 范围为 :user_id 而不是模型中的 :user

  2. 重写模型的验证以将所有唯一性要求作为散列的一部分包含在内

  3. 将测试范围限定为 :user_id

问题中的代码可以正常工作,因为它可以不区分大小写地正确检查唯一性,但自 the docs 中的示例以来,无论如何最好将所有唯一性要求作为散列包含在内。即使对于单个声明也采用这种形式(而且,这是我能找到的使 Shoulda 测试以正确的行为通过的唯一方法)。

这是工作代码的样子:

模型

class Item < ApplicationRecord
belongs_to :user
validates :name, uniqueness: { scope: :user_id, case_sensitive: false }
end

测试

RSpec.describe Item, type: :model do
describe 'validations' do
it { should validate_uniqueness_of(:name).scoped_to(:user_id).case_insensitive }
end
end

关于rspec - 如何使用 Shoulda 正确检查唯一性和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49335196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com