【问题标题】:Rails validation test not passingRails 验证测试未通过
【发布时间】:2015-07-01 20:33:25
【问题描述】:

在我们的 Rails 应用中,我们有以下模型:

class User < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :calendars, through: :administrations
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Calendar < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :users, through: :administrations
end

我们尝试使用以下 administration_test.rb 测试文件验证管理模型:

需要'test_helper'

class AdministrationTest < ActiveSupport::TestCase
  def setup
    @user = users(:noemie)
    @administration = Administration.new(user_id: @user.id, calendar_id: @calendar_id)
  end

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

  test "user id should be present" do
    @administration.user_id = nil
    assert_not @administration.valid?
  end

  test "calendar id should be present" do
    @administration.calendar_id = nil
    assert_not @administration.valid?
  end

end

当我们运行测试时,我们得到以下结果:

FAIL["test_calendar_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700]
 test_calendar_id_should_be_present#AdministrationTest (1435674298.26s)
        Expected true to be nil or false
        test/models/administration_test.rb:21:in `block in <class:AdministrationTest>'

 FAIL["test_user_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700]
 test_user_id_should_be_present#AdministrationTest (1435674298.27s)
        Expected true to be nil or false
        test/models/administration_test.rb:16:in `block in <class:AdministrationTest>'

我们有点迷茫:这是正确的测试方法吗?

如果不是,我们应该怎么写? 如果是,我们怎样才能让它通过?

【问题讨论】:

    标签: ruby-on-rails validation ruby-on-rails-4 testing minitest


    【解决方案1】:

    问题不在于你的测试,而在于你期待错误的结果。

    belongs_toin ActiveRecord 不添加验证,宏只是创建一个关系。

    要验证关系,您将使用validates_associated,它在每个关联记录上调用#valid?,并使用validates_presence_of 来确保关联记录存在。

    class Administration < ActiveRecord::Base
      belongs_to :user
      belongs_to :calendar
      validates_associated :user 
      validates :user, presence: true
    end
    

    在测试验证时,最好在错误哈希上写入断言,因为如果验证因任何其他原因失败,assert_not @administration.valid? 将给出误报。

    不好:

    test "user id should be present" do
      @administration.user_id = nil
      assert_not @administration.valid?
    end
    

    好:

    test "user id should be present" do
      @administration.user_id = nil
      @administration.valid?
      assert @administration.errors.key?(:user)
    end
    

    【讨论】:

      【解决方案2】:

      好的,我们找到了解决方案。

      我们更新了我们的管理模型如下:

      class Administration < ActiveRecord::Base
        belongs_to :user
        belongs_to :calendar
      
        validates :user_id, presence: true
        validates :calendar_id, presence: true
      
      end
      

      还编辑了我们的administration_test.rb 文件:

      require 'test_helper'
      
      class AdministrationTest < ActiveSupport::TestCase
        def setup
          @user = users(:noemie)
          @calendar = calendars(:one)
          # This code is not idiomatically correct.
          @administration = Administration.new(user_id: @user.id, calendar_id: @calendar.id)
        end
      
        test "should be valid" do
          assert @administration.valid?
        end
      
        test "user id should be present" do
          @administration.user_id = nil
          assert_not @administration.valid?
        end
      
        test "calendar id should be present" do
          @administration.calendar_id = nil
          assert_not @administration.valid?
        end
      
      end
      

      现在测试通过就好了。

      【讨论】:

      • 好吧,看看我的回答,因为你的测试很容易出现误报。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多