文中说 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 写错了之类的?