【问题标题】:Rails Tutorial Rspec misunderstandingRails 教程 Rspec 误区
【发布时间】:2012-12-25 22:11:44
【问题描述】:

Michael Hartl 的 rails 教程清单 6.20 显示了以下代码:

before do
    @user = User.new(name: "Example User", email: "user@example.com")
  end
  .
  .
  .
  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

我无法理解这个概念,因为@user.dup 返回完全相同的对象的表示,该对象被复制到 user_with_same 电子邮件中,但@user 从未保存到文件中的任何位置的数据库中。因此,user_with_same_email.save 测试应该每次都有效。但是,测试通过了。有人请解释一下...@user = User.new(...) 上是否有隐式数据库保存?我知道如果是 User.create(...) 会有一个保存,但不是新方法。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    您不会错过隐式保存。

    user_with_same_email 确实保存正确(就我个人而言,我会一直使用 save! 来确保它不会静默失败)

    规范指定的是无法保存主题(即@user),因为数据库中存在具有相同电子邮件的行。

    【讨论】:

    • 感谢您澄清这一点...我没想过,但代码是@user.should_not be_valid。是否有文档告诉我当我调用 should_not 时规范会尝试保存 @..user?我想阅读它以更好地理解
    • ^ 我实际上是在做更多的阅读,我认为有效?方法,由 be_valid 中的块使用,用于测试 @user 是否通过模型文件中的 rails 验证。因为我在那里进行了唯一性验证,所以模型将检查数据库的唯一性。所以没有@..user.save,我现在明白了,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多