【问题标题】:How does @user.save work in user_spec.rb? (rails tutorial chapter 6)@user.save 如何在 user_spec.rb 中工作? (rails教程第6章)
【发布时间】:2012-11-08 01:17:48
【问题描述】:

我正在学习 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 }

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

【问题讨论】:

    标签: ruby-on-rails rspec railstutorial.org


    【解决方案1】:

    是的,它确实将用户保存在数据库中(最有可能在下一次测试之前被database_cleaner 或其他东西清除 - 测试通常意味着主要是相互隔离运行,并且不会通常使状态永久化)。

    与使测试变得多余相反,它是必需的元素。有问题的测试是针对身份验证方法的,而不是针对用户创建的。正在创建用户以针对它测试身份验证方法。基本上,这里发生的是它正在创建用户,然后尝试使用第一个有效密码和下一个无效密码对同一用户进行身份验证,以确保身份验证方法的正确功能。

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多