ฉันกำลังทำงานอย่างหนักเพื่อรักษาไฟล์ข้อมูลจำเพาะของฉันให้สะอาดที่สุดเท่าที่จะเป็นไปได้ การใช้อัญมณี 'shoulda' และการเขียนตัวจับคู่ที่ปรับแต่งตามรูปแบบเดียวกัน
คำถามของฉันเกี่ยวกับการสร้างตัวจับคู่แบบกำหนดเองที่จะล้อม expect{ post :create ... }.to change(Model, :count).by(1)
และสามารถใช้ในกลุ่มตัวอย่างเดียวกันกับตัวจับคู่ 'shoulda' อื่น ๆ รายละเอียดด้านล่าง:
ตัวจับคู่ที่กำหนดเอง (แบบง่าย)
RSpec::Matchers.define :create_a_new do |model|
match do |dummy|
::RSpec::Expectations::ExpectationTarget.new(subject).to change(model, :count).by(1)
end
end
ตัวอย่างการทำงาน
describe 'POST create:' do
describe '(valid params)' do
subject { -> { post :create, model: agency_attributes } }
it { should create_a_new(Agency) }
end
end
งานนี้ใช้ได้ตราบใดที่ฉันใช้ subject
lambda และตัวจับคู่ของฉันเป็นเพียงตัวเดียวในกลุ่มตัวอย่าง
ตัวอย่างที่ล้มเหลว
ตัวอย่างที่ล้มเหลว 1
การเพิ่มตัวอย่างเพิ่มเติมในกลุ่มเดียวกันทำให้ตัวจับคู่อื่นล้มเหลวเนื่องจากตอนนี้ subject
เป็นแลมบ์ดาแทนที่จะเป็นอินสแตนซ์ของคอนโทรลเลอร์
describe 'POST create:' do
describe '(valid params)' do
subject { -> { post :create, model: agency_attributes } }
it { should create_a_new(Agency) }
it { should redirect_to(Agency.last) }
end
end
ตัวอย่างที่ล้มเหลว 2
ตัวจับคู่ 'shoulda' ต้องการให้ฉันกำหนดบล็อก before
แต่สิ่งนี้เข้ากันไม่ได้กับตัวจับคู่ที่กำหนดเองของฉัน
describe 'POST create:' do
describe '(valid params)' do
before { post :create, agency: agency_attributes }
it { should create_a_new(Agency) }
it { should redirect_to(Agency.last) }
end
end
ผลลัพธ์ที่คาดหวัง
ฉันกำลังมองหาวิธีเขียนตัวจับคู่แบบกำหนดเองที่เหมาะกับกลุ่มตัวอย่างเดียวกันกับตัวจับคู่อื่น ๆ ซึ่งหมายความว่าตัวจับคู่แบบกำหนดเองของฉันควรใช้บล็อก before
เพื่อดำเนินการควบคุม "ตัวอย่างที่ล้มเหลว #2" ด้านบนคือวิธีที่ฉัน อยากจะเขียนสเป็คของฉัน เป็นไปได้ไหม?
ขอบคุณที่อ่าน