คุณรู้ว่าสิ่งที่คุณต้องการ ที่ต้องทำ แต่รหัสของคุณไม่ได้ให้ความร่วมมือ อาจมีระดับการเยื้องมากเกินไปหรือเชื่อมโยงวิธีการครึ่งโหลหรือดูไม่สมมาตร ไม่ว่ามันจะเป็นอะไรก็ตาม คุณสามารถเพิกเฉยได้ – ฉันหมายความว่าคุณมีงานในมือที่เต็มไปด้วยคุณสมบัติที่คุณยังต้องการเขียน และนั่นไม่ใช่นั่นจริงๆ แย่. แต่นั่นอาจเป็นความผิดพลาด:รหัสของคุณพยายามบอกบางสิ่งกับคุณ และคุณไม่ต้องการที่จะพลาดมัน
หากคุณสามารถเรียนรู้ที่จะรู้ว่าโค้ดของคุณรู้สึกแปลกๆ เมื่อไหร่ คุณก็จะพัฒนาทักษะการออกแบบซอฟต์แวร์ของคุณได้อย่างรวดเร็วและอย่างมาก . สัญชาตญาณนี้สร้างได้ยาก เนื่องจากมาจากประสบการณ์ การให้คำปรึกษา และการตรวจสอบโค้ด แต่คุณสามารถขอความช่วยเหลือจากห้องสมุดที่ใช้น้ำส้มสายชูแบบวากยสัมพันธ์เพื่อทำให้โค้ดแย่ๆ รู้สึกแย่ได้
น้ำส้มสายชูวากยสัมพันธ์มีหน้าตาเป็นอย่างไร
ต่อไปนี้คือตัวอย่างการใช้น้ำส้มสายชูแบบวากยสัมพันธ์โดยใช้ minitest/mock ซึ่งเป็นไลบรารีการเยาะเย้ยและการขัดถูขนาดเล็กที่มาพร้อมกับ Ruby:
require 'minitest/mock'
class CartTest < MiniTest::Test
def test_error_message_set_on_charge_failure
cart = Cart.new(items)
cart.stub(:charge!, false) do
cart.checkout!
assert_equal "The credit card could not be charged", cart.credit_card_error
end
end
end
เมื่อคุณทำการทดสอบ charge!
วิธีการใน Cart
ถูก stubbed ดังนั้นการทดสอบจะไม่กระทบกับตัวประมวลผลการชำระเงิน ไวยากรณ์ของบล็อกนั้นดีสำหรับทำให้แน่ใจว่าคุณ stub เฉพาะเมื่อคุณต้องการเท่านั้น แต่จะเกิดอะไรขึ้นเมื่อคุณต้องการนำวิธีการต่างๆ มาใช้
require 'minitest/mock'
class CartTest < MiniTest::Test
def test_error_message_set_on_charge_failure
payment_processor = PaymentProcessor.new
cart = Cart.new(items, processor: payment_processor)
payment_processor.stub(:charge!, false) do
payment_processor.stub(:login!, true) do
payment_processor.stub(:logout!, true) do
cart.checkout!
assert_equal "The credit card could not be charged", cart.credit_card_error
end
end
end
end
end
เอ่อ. นั่นเป็นการเยื้องมากมาย และนั่นเป็นเพียงการทดสอบครั้งเดียว – คุณสามารถจินตนาการว่าโค้ดนี้ถูกทำซ้ำในการทดสอบอื่นๆ มากมาย
คุณทำได้ ห่อการซ้อนทั้งหมดนี้เป็นวิธีตัวช่วยทดสอบ แต่ถ้าคุณจริงๆ ฟังโค้ดของคุณ มันกำลังบอกคุณว่าคุณควรหาวิธีที่ดีกว่านี้ อาจถึงเวลาลองใช้ Test Double แทน:
class TestPaymentProcessor < PaymentProcessor
def login!(account_id, key)
true
end
def charge!(amount, credit_card)
credit_card.can_be_charged?
end
def logout!
true
end
end
class CartTest < MiniTest::Test
def test_error_message_set_on_charge_failure
test_payment_processor = TestPaymentProcessor.new
cart = Cart.new(items, processor: test_payment_processor)
cart.credit_card = failing_credit_card
cart.checkout!
assert_equal "The credit card could not be charged", cart.credit_card_error
end
end
ตอนนี้การทดสอบของคุณอ่านง่ายขึ้น นอกจากนี้ คุณมี TestPaymentProcessor
ที่สามารถนำไปใช้ในที่อื่นๆ ได้มากมาย คุณสามารถใช้มันในโหมดการพัฒนาได้ หากคุณไม่ต้องการชนกับเซิร์ฟเวอร์จริง!
โค้ดที่แย่น่าจะทำให้รู้สึกแย่
ด้วยการใช้ไลบรารีที่มีความคิดเห็นซึ่งทำให้โค้ดไม่ถูกต้องชัดเจน คุณจะเริ่มสังเกตเห็นโค้ดที่ไม่ดีได้เร็วและน่าเชื่อถือมากขึ้น และนั่นจะทำให้โค้ดในอนาคตของคุณสะอาดขึ้น อ่านง่ายขึ้น และทำงานด้วยความเจ็บปวดน้อยลง
ห้องสมุดความคิดเห็นที่คุณชื่นชอบคืออะไร และห้องสมุดเหล่านี้จะช่วยคุณค้นหาและแก้ไขโค้ดที่ไม่ถูกต้องได้อย่างไร แจ้งให้เราทราบในความคิดเห็นด้านล่าง!