Ruby on rails 用户如何保存在用户规范rb测试中?

Ruby on rails 用户如何保存在用户规范rb测试中?,ruby-on-rails,railstutorial.org,Ruby On Rails,Railstutorial.org,迈克·哈特尔(Mike Hartl)的书对拒绝重复电子邮件地址进行了如下测试,不区分大小写 调用User.new会创建内存中的用户,但调用@User.save将其保存到数据库中 运行测试时,它会正确地拒绝重复的地址。但我不知道它是怎么工作的。只有具有相同电子邮件的用户\u将保存到数据库,而不是@user。那么,有效性测试如何在不保存@user的情况下检测到重复 require 'spec_helper' describe User do before do @user = Use

迈克·哈特尔(Mike Hartl)的书对拒绝重复电子邮件地址进行了如下测试,不区分大小写

调用
User.new
会创建内存中的用户,但调用
@User.save
将其保存到数据库中

运行测试时,它会正确地拒绝重复的地址。但我不知道它是怎么工作的。只有具有相同电子邮件的
用户\u将保存到数据库,而不是
@user
。那么,有效性测试如何在不保存
@user
的情况下检测到重复

require 'spec_helper'

describe User do

  before do
    @user = User.new(name: "Example User", email: "user@example.com")
  end

  subject { @user }
  .
  .
  .
  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

subject{@user}

因此,示例
it{should\u not\u valid}
在隐含主题
@user
上执行

@user.valid?
返回false,因为您在
电子邮件地址上设置了
唯一性约束
,并且您的数据库中已经有一条具有相同电子邮件地址的记录(使用保存的相同电子邮件
调用
用户)


因此,您的测试示例作为
@user
通过是无效的

具有相同电子邮件的用户实际上保存在数据库中

请注意,主题是
@user

subject{@user}

因此,示例
it{should\u not\u valid}
在隐含主题
@user
上执行

@user.valid?
返回false,因为您在
电子邮件地址上设置了
唯一性约束
,并且您的数据库中已经有一条具有相同电子邮件地址的记录(使用保存的相同电子邮件
调用
用户)


因此,您的测试示例作为
@user
通过是无效的

运行有效性检查时无需保存对象
@user
。rspec表达式
it{should\u not\u valid}
在引擎盖下调用
@user.valid?
。无论是否保存,此方法都可以在ActiveRecord实例上运行。

无需保存对象
@user
即可运行有效性检查。rspec表达式
it{should\u not\u valid}
在引擎盖下调用
@user.valid?
。无论是否已保存ActiveRecord实例,都可以在其上运行此方法