หลีกเลี่ยงการทำซ้ำขณะทดสอบแอตทริบิวต์โมเดลใน RSpec

ฉันมีหลายรุ่น และในรุ่นนี้ ฉันมีคุณสมบัติที่ไม่ต้องการให้ว่างเปล่า

ฉันต้องการทดสอบโมเดลของฉันอย่างหนักเกี่ยวกับข้อจำกัดเหล่านี้โดยใช้ RSpec และ Factory Girl

อย่างไรก็ตาม ฉันจบลงด้วยการทำซ้ำโค้ด:

user_spec:

it 'is invalid if blank' do
  expect {
   FactoryGirl.create(:user, nickname => '')
  }.to raise_error(ActiveRecord::RecordInvalid)
end

message_spec:

it 'is invalid if blank' do
  expect {
   FactoryGirl.create(:message, :re => '')
  }.to raise_error(ActiveRecord::RecordInvalid)
end

ฉันจะแยกตัวประกอบมันได้อย่างไร?


person Valentin Trinqué    schedule 08.12.2015    source แหล่งที่มา


คำตอบ (1)


RSpec มีหลายวิธีในการดำเนินการดังกล่าว เช่น ตัวอย่างที่แบ่งปัน

1. สร้างไฟล์ใน [RAILS_APP_ROOT]/support/ ของคุณ

จากตัวอย่างของคุณ คุณสามารถตั้งชื่อไฟล์นี้ว่า not_blank_attribute.rb จากนั้นคุณเพียงแค่ต้องย้ายโค้ดที่ซ้ำกันเข้ามาและปรับให้สามารถกำหนดค่าได้ :

RSpec.shared_examples 'a mandatory attribute' do |model, attribute|
  it 'should not be empty' do
    expect {
      FactoryGirl.create(model, attribute => '')
    }.to raise_error(ActiveRecord::RecordInvalid)
  end
end

<แข็งแกร่ง>2. ใช้ฟังก์ชัน it_behaves_like ในข้อกำหนดของคุณ

ฟังก์ชั่นนี้จะเรียกตัวอย่างที่แชร์

RSpec.describe User, '#nickname' do
  it_behaves_like 'a mandatory attribute', :User, :nickname
end

ในที่สุดมันก็เอาท์พุต:

User#nickname
  behaves like a mandatory attribute
      should not be empty
person Valentin Trinqué    schedule 08.12.2015