新手问题 RailsTutorial 第 6 章用户模型的问题

dragonszy · 2013年12月04日 · 最后由 dragonszy 回复于 2013年12月04日 · 1723 次阅读

文中说 user = User.new() 并没有改动数据库,user 对象在内存里。user.save 后才存入数据库。

可是后文唯一性验证的时候,before 的@user好像没有 save 过啊?那么它是如何能判断 user_with_same_email 和数据库中的 user 有相同 email 的?

require 'spec_helper'

describe User do

  before do
    @user = User.new(name: "Example User", email: "[email protected]")
  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_with_same_email 确实有 save,保存到数据库这一动作。个人感觉在 describe "when email address is already taken" do 的 before do 里要先加上 user.save。

rails console 里的示例确实先 create 了 user

$ rails console --sandbox
>> user = User.create(name: "Example User", email: "[email protected]")
>> user.email.upcase
=> "[email protected]"
>> user_with_same_email = user.dup
>> user_with_same_email.email = user.email.upcase
>> user_with_same_email.valid?
=> true

但是按照书上的写法测试也都能通过。请问是为什么?

PS 再问一下,如何测试“测试中的错误”,比如说 visit xxx 写错了之类的?

1 楼 已删除

我的理解是: 先保存了这个 user

before do
  user_with_same_email = @user.dup
  user_with_same_email.email = @user.email.upcase
  user_with_same_email.save
end

然后判断下面的 user 是否重复

before do
  @user = User.new(name: "Example User", email: "[email protected]")
end

额,是我看漏了,书中有句话:

我们使用 @user.dup 方法创建一个和 @user Email 地址一样的用户对象,然后存储这个用户,因为数据库中的 @user 已经占用了这个 Email 地址,所以不能成功存入,无法得到一个合法的用户记录。

我以为 dup 只有复制的意思,原来 dup 还有 save 功能。

不对啊,莫非这里的 dup 重写过?为什么复制对象的方法有 save 功能?

it { should_not be_valid }

这里的 it 指的是 subject { @user },所以判断的应该是下面的是否有效吧

@user = User.new(name: "Example User", email: "[email protected]")
before do
  user_with_same_email = @user.dup
  user_with_same_email.email = @user.email.upcase
  user_with_same_email.save
end

这个是第一次保存数据库成功的数据,代码和后面的解释有些不对应,理解要转个弯。

多谢!好像懂了!先保存了 user_with_same_email,再看 user 合不合理。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号