1

我对 Michael Hartl 教程中的这个测试有疑问:

模型:

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 }通过了。

我怎么了?

4

1 回答 1

1

真正发生的事情:

before

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

describe

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

it

  • should_not be_valid调用.valid?@user,由于我们刚刚插入了具有相同电子邮件的用户,@user 无效。所以测试通过了。
于 2013-03-12T17:35:47.403 回答