我正在为 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
的方法在测试期间用新的配置值刷新模型验证器?
问题是在这样的验证中定义
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 }