我对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 }
已通过。我出错了什么?
答案 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无效。所以考试通过了。