ruby-on-rails – 独立于rails app中的模型测试自定义验证功能
发布时间:2020-12-17 02:05:49 所属栏目:百科 来源:网络整理
导读:我正在构建一个自定义验证方法,以便在我的rails应用程序中使用.我想要构建的验证器类型将模型中调用验证器的列与其他表中的列进行比较.以下是一个代码示例,说明了我尝试构建的验证器的模式. module ActiveModel module Validations module ClassMethods # ex
我正在构建一个自定义验证方法,以便在我的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不是架构的一部分. 如何在测试中创建作为模式一部分的模拟模型? 解决方法
如果你正在使用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 >关于之前的一个注释(:all)它是一个“全局”设置,因此数据会从一个到另一个持久存在,您可能希望用事务将每个数据包装起来并在之后回滚,或者改为使用之前(:每个)将清理表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |