如何为ActiveModel的包含验证器的每个值生成RSpec测试用例

时间:2016-01-24 16:36:51

标签: ruby-on-rails validation ruby-on-rails-4 rspec activemodel

我有一个简单的ActiveModel类,它包含一个字符串字段,我在其上定义了一个包含验证器:

$ rails generate model Person name:string gender:string
class Person < ActiveRecord::Base
  validates :name, presence: true
  validates :gender, inclusion: { in: %w(male female unknown) }
end

现在我正在编写一些RSpec测试用例,它应该代表该模型的最新文档。

describe Person, type: :model do
  context 'attributes' do
    context 'gender' do
      it 'allows "male"' { ... }
      it 'allows "female"' { ... }
      it 'allows "unknown"' { ... }
    end
  end
end

如何从提供给验证器的列表中自动生成这三个测试用例? 我知道我可以使用Person.validators_on(:gender).first获取验证器,但不知道如何查询in选项的可枚举验证器实例。

最终目标是用

之类的东西替换这三个测试用例
query_validator_for_in_enum().each do |valid_gender|
  it "allows '#{valid_gender}'" { ... }
end

理由:我不想为“性别”创建一个单独的表格。解决这个问题。

1 个答案:

答案 0 :(得分:2)

我想你可能想查看shoulda-matchers gem。

添加此类检查非常简单:

it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_inclusion_of(:gender).in_array(%w(male female unknown)) }

我会在模型中创建一个常量:

GENDERS = %w(male female unknown)

并在规格中使用它:

it { is_expected.to validate_inclusion_of(:gender).in_array(Person::GENDERS) }