2016-01-24 38 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'。這個解決方案太簡單了,我想到了。非常感謝! –