2016-01-24 39 views
1

我有一个简单的加载ActiveModel类抱着我定义的列入验证字符串字段加载ActiveModel的包容性验证的每个值:如何产生的RSpec测试用例

$ 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 

理由:我不希望创建“社会性别”一个单独的表来解决此问题。

回答

2

我想你可能想看看shoulda-matchers宝石。

添加这种检查是那么容易,因为:

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) } 
+0

对,我可以将模型定义中的相同枚举复制并粘贴到规范中。但是,这样我总是必须记得在更改模型验证枚举时更新规范。 –

+0

实际上,我会不停地用'GENDERS'来只更新它在一个地方 - 模型。测试不需要改变 –

+0

m(因为,一个常量'GENDERS'。这个解决方案太简单了,我想到了。非常感谢! –