@user.save如何在user_spec.rb中工作?(Rails教程第6章)



我在轨道教程上做红宝石,并且列出了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 }

这是否真的保存了数据库中的测试用户?在测试其密码的正确性之前,不会保存此测试用户会使测试多余?在我看来,就像我只是保存用户(使用密码),然后检查它是否仍然具有相同的密码(我刚刚保存了它!)是有人能够澄清为什么我为什么'M错误?

是的,它确实确实将用户保存在数据库中(最有可能在下一个测试之前通过database_cleaner或其他内容清除 - 通常是孤立运行的测试 - 彼此之间,通常不会永久存在)。

与使测试冗余相反,这是必需的元素。所讨论的测试是用于身份验证的方法,而不是用户创建的。正在创建用户以测试针对它的身份验证方法。基本上,这里发生的事情是它正在创建用户,然后尝试使用有效的密码以及下一个和无效的密码来验证同一用户,以确保身份验证方法的正确功能。

最新更新