Railsのモデルのvalidationのrspecで、下記のような書き方をしています。
describe 'customer_number' do let(:customer) { build(:customer) } context '成功' do example '数字6桁なら有効' do customer.customer_number = "123456" expect(customer).to be_valid end end context '失敗' do example 'ブランクの場合は無効' do customer.customer_number = "" customer.valid? expect(customer.errors[:customer_number]).to be_present end example '重複している場合は無効' do existing_customer = create(:customer) customer.customer_number = existing_customer.customer_number customer.valid? expect(customer.errors[:customer_number]).to be_present end example '数字以外の場合は無効' do customer.customer_number = "ABCDEF" customer.valid? expect(customer.errors[:customer_number]).to be_present end example '数字5桁以下の場合は無効' do customer.customer_number = "12345" customer.valid? expect(customer.errors[:customer_number]).to be_present end example '数字7桁以上の場合は無効' do customer.customer_number = "1234567" customer.valid? expect(customer.errors[:customer_number]).to be_present end end
context '失敗'
のブロックでcustomer_number.valid?
を何度も書いているのをなんとかしたくて、subject
を使って書きのようにリファクタリングしました。
describe 'customer_number' do let(:customer) { build(:customer) } context '成功' do example '数字6桁なら有効' do customer.customer_number = "123456" expect(customer).to be_valid end end context '失敗' do subject do customer.valid? customer.errors[:customer_number] end example 'ブランクの場合は無効' do customer.customer_number = "" is_expected.to be_present end example '重複している場合は無効' do existing_customer = create(:customer) customer.customer_number = existing_customer.customer_number is_expected.to be_present end example '数字以外の場合は無効' do customer.customer_number = "ABCDEF" is_expected.to be_present end example '数字5桁以下の場合は無効' do customer.customer_number = "12345" is_expected.to be_present end example '数字7桁以上の場合は無効' do customer.customer_number = "1234567" is_expected.to be_present end end
会社にrspecを使える人がいないので、はたして、subject
をこのように使ってよいものか? とrspecの慣例的なところが気になり質問を投稿させていただきました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/13 10:31