我正在进行Ruby on Rails教程,最多可达Listing 6.29。它描述了(看似标准的)用户身份验证过程的测试。
我的问题是理解user_spec.rb文件的以下(已编辑)部分:
describe User do
before do
@user = User.new(name: "Example User", email: "user@example.com",
password: "foobar", password_confirmation: "foobar")
end
subject { @user }
describe "return value of authenticate method" do
before { @user.save }
let(:found_user) { User.find_by_email(@user.email) }
describe "with valid password" do
it { should == found_user.authenticate(@user.password) }
end
describe "with invalid password" do
let(:user_for_invalid_password) { found_user.authenticate("invalid") }
it { should_not == user_for_invalid_password }
specify { user_for_invalid_password.should be_false }
end
end
end
我的主要困惑是:
before { @user.save }
这是否真的将测试用户保存在数据库中?在测试密码的正确性之前,不会保存此测试用户会使测试变得多余吗? 在我看来,我只是保存用户(使用密码),然后检查它是否仍然具有相同的密码(我刚刚保存了它!)是否有人能够澄清为什么我错了?
答案 0 :(得分:1)
是的,它确实将用户保存在数据库中(最有可能在下一次测试之前被database_cleaner或其他东西清除 - 测试通常意味着主要是彼此隔离运行的,通常不会延续国家)。
与使测试冗余相反,它是必需的元素。有问题的测试是针对身份验证方法,而不是用户创建。正在创建用户以便针对它测试身份验证方法。基本上,这里发生的是它创建用户,然后尝试使用有效密码和下一个无效密码对同一用户进行身份验证,以确保身份验证方法的正常功能。