User模型邮箱唯一性单元测试失败问题求助
问题原因
你用build创建的user1仅存在于内存中,并未保存到数据库。而Rails的uniqueness验证是通过查询数据库判断重复的,此时数据库里没有该邮箱的记录,所以user2会被判定为有效,导致测试失败。
修复方法
只需确保user1被保存到数据库,再验证user2即可,两种方案任选:
方案1:用create直接创建并保存user1
修改测试代码:
it "has a unique email" do user1 = create(:user, email: "example@email.com") user2 = build(:user, email: "example@email.com") expect(user2).to_not be_valid end
方案2:手动保存build生成的user1
it "has a unique email" do user1 = build(:user, email: "example@email.com") user1.save user2 = build(:user, email: "example@email.com") expect(user2).to_not be_valid end
额外注意
模型层的唯一性验证只能拦截常规操作,为了绝对避免重复数据,必须在数据库层面添加唯一索引:
- 生成迁移文件:
rails generate migration AddUniqueIndexToUsersEmail
- 修改迁移文件内容:
class AddUniqueIndexToUsersEmail < ActiveRecord::Migration[7.0] def change add_index :users, :email, unique: true end end
- 执行迁移:
rails db:migrate
这样即使绕过模型验证直接操作数据库,也能保证邮箱的唯一性。
内容的提问来源于stack exchange,提问作者cinameng
相关产品推荐
相关产品推荐

