我正在构建一个自定义验证方法,以便在我的rails应用中使用。我想要构建的验证器类型将模型中调用验证器的列与其他表中的列进行比较。以下是一个代码示例,说明了我尝试构建的验证器的模式。
module ActiveModel
module Validations
module ClassMethods
# example: validate_a_column_with_regard_to_other_tables :column, tables: { table_one: :some_column }
def validate_a_column_with_regard_to_other_tables(*attr_names)
validates_with WithRegardToOtherTablesValidator, _merge_attributes(attr_names)
end
end
class WithRegardToOtherTablesValidator < EachValidator
def validate_each(record, attribute, value)
# compare record, attribute or value to all records that match table: :column in :tables
end
end
end
end
可以使用应用程序和架构中存在的模型对此进行测试。但是,这不是测试验证器的好方法,因为它会将验证器描述为依赖于它不依赖的模型。
我能想到的另一种方法是在测试中创建一组模拟模型。
class ValidateModel < BaseModel
validate_a_column_with_regard_to_other_tables :column, :tables { compare_to_model: :some_column }
end
class CompareToModel < BaseModel
attr_accessor :some_column
end
但是,无法验证:列与以下内容有关:some_column in:compare_to_model,因为:compare_to_model不是架构的一部分。
如何在测试中创建作为模式一部分的模拟模型? 或者有更好的方法来测试这样的自定义验证器函数吗?
答案 0 :(得分:1)
如果您使用rspec
,可以设置如下内容:
before(:all) do
ActiveRecord::Migration.create_table :compare_to_model do |t|
t.string :some_column
t.timestamps
end
end
it "validates like it should" do
...
end
after(:all) do
ActiveRecord::Migration.drop_table :compare_to_model
end
before(:all)
的一个注释,它是一个“全局”设置,因此数据会从一个it
持续到另一个,您可能希望用事务和滚动来包装每个it
它后面或后面有一个before(:each)
来清理表格。