何时触发了电子邮件唯一性验证?

时间:2013-03-12 16:04:51

标签: validation ruby-on-rails-3.2

我对this test from the Michael Hartl tutorial提出了一个问题:

型号:

class User < ActiveRecord::Base
  .
  .
  .
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true
end

测试

require 'spec_helper'

describe User do

  before do
    @user = User.new(name: "Example User", email: "user@example.com")
  end
  .
  .
  .
  describe "when email address is already taken" do
    before do
      user_with_same_email = @user.dup
      user_with_same_email.email = @user.email.upcase
      user_with_same_email.save
    end

    it { should_not be_valid }
  end
end

我对电子邮件唯一性验证器的理解是它无法在数据库中添加两次。但是在这个测试中,用户只是用新的实例化而不是创建。

所以我认为这就是:

  • @user = User.new(仅在记忆中)
  • ...
  • user_with_same_email = @user.dup我们内存中有两个用户
  • ...
  • user_with_same_email.save我们在数据库中插入第一个用户,因此它应该有效,但测试it { should_not be_valid }已通过。

我出错了什么?

1 个答案:

答案 0 :(得分:1)

真正发生的事情:

before

  • @user = User.new(仅在记忆中)

describe

  • user_with_same_email = @user.dup我们内存中有两个用户
  • user_with_same_email.save我们在db中插入第一个用户,所以它应该是有效的,它就是!但这不是正在测试的内容

it

  • should_not be_valid在@user上调用.valid?,由于我们刚刚插入了具有相同电子邮件的用户,因此@user无效。所以考试通过了。