【问题标题】:How is user saved in user_spec.rb test?用户如何保存在 user_spec.rb 测试中?
【发布时间】:2014-04-25 02:18:35
【问题描述】:

Mike Hartl 的书为Listing 6.17 提供了以下内容,用于测试拒绝重复电子邮件地址,不区分大小写。

User.new 的调用创建了一个内存用户,但没有在任何地方调用@user.save 将其保存到数据库中。

运行测试,它正确拒绝了重复的地址。但我无法弄清楚它是如何工作的。只有user_with_same_email 保存到数据库而不是@user。那么有效性测试如何在没有保存@user 的情况下检测到重复项呢?

require 'spec_helper'

describe User do

  before do
    @user = User.new(name: "Example User", email: "user@example.com")
  end

  subject { @user }
  .
  .
  .
  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

【问题讨论】:

    标签: ruby-on-rails railstutorial.org


    【解决方案1】:

    user_with_same_email实际上保存在数据库中。

    注意主题是@user

    subject { @user }

    因此,示例 it { should_not be_valid } 在隐含主题 @user 上执行。

    @user.valid? 返回 false,因为您已将 uniqueness constraint 放在 email address 上,并且您的数据库中已经有一条具有相同电子邮件地址的记录(回想已保存的 user_with_same_email)。

    因此,您的测试示例通过 @user 无效。

    【讨论】:

      【解决方案2】:

      无需保存对象@user 即可运行有效性检查。 rspec 表达式it { should_not be_valid } 在后台调用@user.valid?。此方法可以在 ActiveRecord 实例上运行,无论它是否已保存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        相关资源
        最近更新 更多