Ruby on Rails 测试 – 重置/刷新验证器?

问题描述 投票:0回答:1

我正在为 RoR Gem 编写测试,该测试具有依赖于配置变量的验证:

class MyModel < ApplicationRecord
  validates_length_of :field_name, minimum: GemName.minimum_field_length
end

我可以验证此配置选项是否按预期工作,但是我想确保它已在测试中涵盖:

class MyModelTest < ActiveSupport::TestCase
  test "field length is validated" do
    model = MyModel(field_name: 'a' * 25

    # Default minimum length is 20
    assert model.valid?

    # Test different length validation
    GemName.minimum_field_length = 30
    assert_not model.valid?
  end
end

第二个断言失败(模型有效)。如果我在那里添加一个调试器并检查,

GemName.minimum_field_length
给我
30
,表明它已更改,但是如果我查看
MyModel.validators
的结果,最小值仍然是原始默认值20。大概这是因为验证器被创建一次,无论是在测试开始时还是在第一次调用模型时(我尝试在更改配置后创建一个新的
MyModel
实例,但没有成功)。有没有类似
.reset_column_information
的方法在测试期间用新的配置值刷新模型验证器?

ruby-on-rails ruby validation testing
1个回答
0
投票

问题是在这样的验证中定义

minimum
长度

validates_length_of :field_name, minimum: GemName.minimum_field_length

然后仅在第一次读取文件时设置最小值一次。当

GemName.minimum_field_length
改变时,验证器的配置不再改变。

但是,当您使用 lambda 来初始化验证器时,则将在每次验证器调用时对 lambda 进行求值,因此应该获取更改。

试试这个:

validates_length_of :field_name, minimum: -> { GemName.minimum_field_length }
© www.soinside.com 2019 - 2024. All rights reserved.