ฉันต้องการตรวจสอบการเปลี่ยนแปลงหลายอย่างในโมเดลเมื่อส่งแบบฟอร์มในคุณสมบัติจำเพาะ ตัวอย่างเช่นฉันต้องการตรวจสอบให้แน่ใจว่าชื่อผู้ใช้เปลี่ยนจาก X เป็น Y และรหัสผ่านที่เข้ารหัสถูกเปลี่ยนด้วยค่าใด ๆ
ฉันรู้ว่ามีคำถามบางอย่างเกี่ยวกับเรื่องนี้แล้ว แต่ฉันไม่พบคำตอบที่เหมาะสมสำหรับฉัน คำตอบที่ถูกต้องที่สุดดูเหมือนผู้ChangeMultiple
จับคู่โดย Michael Johnston ที่นี่: เป็นไปได้หรือไม่ที่ RSpec จะคาดหวังการเปลี่ยนแปลงในสองตาราง? . ข้อเสียคือตรวจสอบการเปลี่ยนแปลงอย่างชัดเจนจากค่าที่ทราบเป็นค่าที่ทราบเท่านั้น
ฉันสร้างรหัสหลอกว่าฉันคิดว่าตัวจับคู่ที่ดีกว่าจะมีลักษณะอย่างไร:
expect {
click_button 'Save'
}.to change_multiple { @user.reload }.with_expectations(
name: {from: 'donald', to: 'gustav'},
updated_at: {by: 4},
great_field: {by_at_leaset: 23},
encrypted_password: true, # Must change
created_at: false, # Must not change
some_other_field: nil # Doesn't matter, but want to denote here that this field exists
)
ฉันได้สร้างโครงกระดูกพื้นฐานของตัวChangeMultiple
จับคู่เช่นนี้:
module RSpec
module Matchers
def change_multiple(receiver=nil, message=nil, &block)
BuiltIn::ChangeMultiple.new(receiver, message, &block)
end
module BuiltIn
class ChangeMultiple < Change
def with_expectations(expectations)
# What to do here? How do I add the expectations passed as argument?
end
end
end
end
end
แต่ตอนนี้ฉันได้รับข้อผิดพลาดนี้แล้ว:
Failure/Error: expect {
You must pass an argument rather than a block to use the provided matcher (nil), or the matcher must implement `supports_block_expectations?`.
# ./spec/features/user/registration/edit_spec.rb:20:in `block (2 levels) in <top (required)>'
# /Users/josh/.rvm/gems/ruby-2.1.0@base/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
# /Users/josh/.rvm/gems/ruby-2.1.0@base/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `block in load'
ความช่วยเหลือใด ๆ ในการสร้างตัวจับคู่แบบกำหนดเองนี้ได้รับการชื่นชมอย่างมาก
.and change { @something }.by(0)