尽管尚未实施验证,Rails教程仍通过测试

时间:2018-06-28 20:56:04

标签: ruby-on-rails ruby testing

我正在关注迈克尔·哈特尔(Michael Hartl)的Rails教程(https://www.railstutorial.org/book/following_users#code-relationship_validations),并且试图了解为什么我认为应该失败的测试通过了。

我有一个Relationship模型。看起来像这样:

class Relationship < ApplicationRecord
    belongs_to :follower, class_name: "User"
    belongs_to :followed, class_name: "User"
    # validates :follower_id, presence: true
    # validates :followed_id, presence: true
end

我添加了以下测试:

require 'test_helper'

class RelationshipTest < ActiveSupport::TestCase

  def setup
    @relationship = Relationship.new(follower_id: users(:michael).id,
                                     followed_id: users(:archer).id)
  end

  test "should be valid" do
    assert @relationship.valid?
  end

  test "should require a follower_id" do
    @relationship.follower_id = nil
    assert_not @relationship.valid?
  end

  test "should require a followed_id" do
    @relationship.followed_id = nil
    assert_not @relationship.valid?
  end
end

schema.rb中的相关部分如下所示:

create_table "relationships", force: :cascade do |t|
  t.integer "follower_id"
  t.integer "followed_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.index ["followed_id"], name: "index_relationships_on_followed_id"
  t.index ["follower_id", "followed_id"], name: "index_relationships_on_follower_id_and_followed_id", unique: true
  t.index ["follower_id"], name: "index_relationships_on_follower_id"
end

尽管已注释掉验证,但测试仍通过。据我了解,最后两个断言应该会失败,因为没有验证来防止将任一列设置为nil。他们为什么不通过验证就通过?是因为两列都有索引吗?

1 个答案:

答案 0 :(得分:1)

在rails 5中,默认情况下需要belongs_to关联,您可以将:optional选项设置为true,但默认为false。

我相信本教程已经存在多年了(我知道 a Michael Hartl rails教程已经存在了一段时间,我认为这是相同的),尽管看起来已经更新了至少Rails 5.1.4。当将类似的东西更新到较新的版本时,有时会丢失一些东西,我以为他们只是错过了此参考,或者没有意识到belongs_to已更改(默认情况下它是可选的,因此您必须那里的验证)。他们很有可能只是更新了rails版本并重新运行了测试,发现一切仍然通过。