Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:测试多个模型的自定义验证器_Ruby On Rails_Ruby_Validation_Rspec_Dry - Fatal编程技术网

Ruby on rails Rails:测试多个模型的自定义验证器

Ruby on rails Rails:测试多个模型的自定义验证器,ruby-on-rails,ruby,validation,rspec,dry,Ruby On Rails,Ruby,Validation,Rspec,Dry,我有一个自定义验证器来测试不同组织类型的税号。我想知道是否有可能用Rspec测试它,通过不同的模型进行测试,以保持干燥 app/models/restaurant.rb class Restaurant < ApplicationRecord validates :tax_number, uniqueness: true, presence: true validates_with TaxNumberValidator end 提前感谢。用%i[重新启动供应商]围绕整个描述。每一

我有一个自定义验证器来测试不同组织类型的税号。我想知道是否有可能用Rspec测试它,通过不同的模型进行测试,以保持干燥

app/models/restaurant.rb

class Restaurant < ApplicationRecord
  validates :tax_number, uniqueness: true, presence: true
  validates_with TaxNumberValidator
end

提前感谢。

%i[重新启动供应商]围绕整个
描述
。每一个
?可能都是您的测试策略的一个使用案例?您的测试策略回顾过去。正如@zwippie所建议的,在每个模型规范中使用类似于
的东西,它的行为类似于“税号验证”
,而不是在验证器规范中循环使用每个模型。您的模型规范应该都在一个位置,不会像那样分散在多个文件中。@TomLord是否可以单独测试验证程序,而不是在所有使用它的模型中重复相同的测试?您可以单独测试验证程序吗?是的,但是——出于我上面不断重复的原因——这不是最好的主意。您可以只给它一个“任意”模型来运行测试,也可以使用模拟对象。(但是如果您使用mock,您还应该确保所有模型都满足mock的接口!)
class Supplier < ApplicationRecord
  validates :tax_number, uniqueness: true, presence: true
  validates_with TaxNumberValidator
end
describe TaxNumberValidator do
  with_model :restaurant do
    table do |t|
      t.string :tax_number
    end

    model do
      validates :tax_number, tax_number: true
    end
  end

  it 'should be valid with a valid tax number' do
    expect(Fabricate(:restaurant)).to be_valid
  end

  it 'should be invalid without an tax number' do
    expect(Fabricate.build :restaurant, tax_number: '').not_to be_valid
  end

  it 'should be invalid with an invalid tax number' do
    expect(Fabricate.build :restaurant, tax_number: '111').not_to be_valid
    expect(Fabricate.build :restaurant, tax_number: 'abc').not_to be_valid
  end
end