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

Ruby on rails @user.save如何在user_spec.rb中工作?(rails教程第6章),ruby-on-rails,rspec,railstutorial.org,Ruby On Rails,Rspec,Railstutorial.org,我正在学习RubyonRails教程,并且正在学习。它描述了(看似标准的)用户身份验证过程的测试 我的问题是理解user_spec.rb文件的以下(编辑)部分: describe User do before do @user = User.new(name: "Example User", email: "user@example.com", password: "foobar", password_confirmation: "foobar")

我正在学习RubyonRails教程,并且正在学习。它描述了(看似标准的)用户身份验证过程的测试

我的问题是理解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 }
我的主要困惑是这句话:

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 }

这是否真的将测试用户保存在数据库中?在测试其密码的正确性之前保存此测试用户不会使测试变得多余吗在我看来,我只是在保存用户(使用其密码),然后检查它是否仍然具有相同的密码(我刚才使用的密码!)是否有人能够澄清我的错误原因?

是的,它确实在数据库中保存了用户(最有可能在下一次测试之前被或其他什么东西清除掉-测试通常意味着大部分是在彼此隔离的情况下运行的,并且通常不会使状态永久化)

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