ม็อกและสปาย
แยกโค้ดที่กำลังทดสอบออกมา
ม็อกและสปาย เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
ตัวแทนสำหรับการทดสอบ
บางครั้งฟังก์ชันต้องพึ่งพาสิ่งที่ทำงานช้าหรืออยู่นอกระบบ เช่น การเรียกเครือข่ายหรือตัวบันทึกข้อมูล ตัวแทนสำหรับการทดสอบจะเข้ามาแทนที่สิ่งเหล่านั้นด้วยตัวแทนที่ควบคุมได้
busted มีตัวแทนสามชนิด ได้แก่ สปาย สตับ และ ม็อก แต่ละชนิดเหมาะกับความต้องการที่แตกต่างกัน
สปายทำอะไร
สปายจะห่อฟังก์ชันและบันทึกวิธีที่ฟังก์ชันนั้นถูกเรียก ขณะเดียวกันก็ยังเรียกใช้ฟังก์ชันต้นฉบับอยู่ จึงช่วยให้คุณตรวจสอบได้ว่ามีการเรียกใช้สิ่งนั้นหรือไม่
สร้างสปายด้วย spy.new โดยครอบฟังก์ชันไว้ หรือใช้สปายกับฟิลด์ของตารางก็ได้
local s = spy.new(function() end)
s(1, 2)
assert.spy(s).was.called()การสังเกตเมธอด
ใช้ spy.on เพื่อเฝ้าดูเมธอดในตารางที่มีอยู่ เมธอดต้นฉบับยังคงทำงาน แต่ busted จะติดตามการเรียกใช้แต่ละครั้ง
วิธีนี้เหมาะสำหรับยืนยันผลข้างเคียง เช่น การตรวจสอบว่ามีการเรียกตัวบันทึกข้อมูล
spy.on(logger, "info")
service.run()
assert.spy(logger.info).was.called()การตรวจสอบจำนวนครั้งที่เรียก
สปายจะบันทึกว่าถูกเรียกกี่ครั้ง ใช้ was.called(n) เพื่อยืนยันจำนวนครั้งที่แน่นอน
วิธีนี้ช่วยตรวจจับข้อผิดพลาดที่ฟังก์ชันถูกเรียกบ่อยเกินไปหรือไม่ถูกเรียกเลย
assert.spy(s).was.called(2)
assert.spy(s).was_not.called()การตรวจสอบอาร์กิวเมนต์ที่ส่ง
คุณสามารถยืนยันว่าอาร์กิวเมนต์ใดถูกส่งให้สปายด้วย was.called_with busted จะเปรียบเทียบอาร์กิวเมนต์ที่บันทึกไว้กับสิ่งที่คุณคาดหวัง
วิธีนี้ตรวจสอบได้ไม่ใช่แค่ว่าฟังก์ชันทำงาน แต่ยังตรวจสอบว่าฟังก์ชันทำงานอย่างถูกต้องด้วย
local s = spy.new(function() end)
s("user", 42)
assert.spy(s).was.called_with("user", 42)สตับทำอะไร
สตับจะแทนที่ฟังก์ชันทั้งหมด ทำให้ฟังก์ชันต้นฉบับไม่ถูกเรียกใช้ ใช้สตับเพื่อข้ามงานที่ช้าหรือไม่พึงประสงค์ เช่น การเข้าถึงเครือข่ายหรือดิสก์จริง
สร้างสตับด้วย stub บนฟิลด์ของตาราง โดยค่าเริ่มต้นสตับจะไม่ทำอะไรและส่งกลับค่า nil
stub(api, "fetch")
service.load()
assert.stub(api.fetch).was.called()ค่าที่สตับส่งกลับ
คุณสามารถกำหนดให้สตับส่งกลับค่าคงที่ด้วย returns วิธีนี้จะป้อนข้อมูลที่ควบคุมได้ให้กับโค้ดที่กำลังทดสอบ
จากนั้นการทดสอบของคุณจะไม่ต้องพึ่งพาสิ่งที่โค้ดใช้จริงอีกต่อไป
stub(api, "fetch").returns({id = 1})
local r = service.load()
assert.are.same({id = 1}, r)ม็อกทำอะไร
ม็อกจะนำตารางที่มีอยู่มาเปลี่ยนฟังก์ชันทั้งหมดให้เป็นสปายหรือสตับพร้อมกัน จึงเป็นวิธีที่สะดวกสำหรับติดตามอ็อบเจ็กต์ทั้งชุด
เรียก mock(obj) เพื่อห่ออ็อบเจ็กต์ จากนั้นจึงยืนยันผลของเมธอดแต่ละรายการ
local m = mock(realLogger)
app.start(m)
assert.spy(m.warn).was.called()ม็อกที่แทนที่เมธอดด้วยสตับ
การส่ง true เป็นอาร์กิวเมนต์ตัวที่สองให้กับ mock จะทำให้ทุกเมธอดกลายเป็นสตับ ดังนั้นเมธอดต้นฉบับจะไม่ถูกเรียกใช้ วิธีนี้จะแยกอ็อบเจ็กต์ออกจากส่วนอื่นอย่างสมบูรณ์
ใช้วิธีนี้เมื่อเมธอดจริงมีผลข้างเคียงที่คุณต้องหลีกเลี่ยง
local db = mock(database, true)
db.query.returns({})
assert.are.same({}, repo.all())การคืนค่าตัวแทนทดสอบ
สปาย สตับ และม็อกจะเปลี่ยนแปลงตารางที่ใช้ร่วมกัน คุณจึงต้องคืนค่าเดิม ไม่เช่นนั้นการทดสอบภายหลังจะพบตัวแทนทดสอบนั้น เรียก :revert() หรือ mock.revert
วางการคืนค่าไว้ใน after_each เพื่อรับประกันว่าสถานะระหว่างการทดสอบแต่ละครั้งจะสะอาด
after_each(function()
mock.revert(m)
end)การเลือกตัวแทนทดสอบที่เหมาะสม
ใช้สปายเพื่อสังเกตฟังก์ชันจริง ใช้สตับเพื่อแทนที่ฟังก์ชันด้วยพฤติกรรมที่ควบคุมได้ และใช้ม็อกเพื่อห่ออ็อบเจ็กต์ทั้งชุดพร้อมกัน
เลือกตัวแทนทดสอบที่เรียบง่ายที่สุดและยังทำงานได้ตามต้องการ การใช้ม็อกมากเกินไปอาจทำให้การทดสอบเปราะบางและซ่อนข้อผิดพลาดจริง
describe("mailer", function()
it("sends once", function()
local s = spy.on(smtp, "send")
mailer.notify("a@b.com")
assert.spy(s).was.called(1)
end)
end)ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับตัวแทนสำหรับการทดสอบของ busted
ทบทวน
ตัวแทนสำหรับการทดสอบช่วยแยกโค้ดออกจากสิ่งที่ทำงานช้าหรืออยู่นอกระบบ สปาย บันทึกการเรียกใช้ขณะยังเรียกฟังก์ชันต้นฉบับ สตับ แทนที่ฟังก์ชันด้วยพฤติกรรมที่ควบคุมได้ และ ม็อก ห่ออ็อบเจ็กต์ทั้งชุด
ยืนยันผลด้วย was.called และ was.called_with และคืนค่าตัวแทนทดสอบด้วย revert ใน after_each เสมอ เพื่อให้การทดสอบแยกจากกัน
คำถามที่พบบ่อย
บทเรียน “ม็อกและสปาย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ม็อกและสปาย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ม็อกและสปาย”
แยกโค้ดที่กำลังทดสอบออกมา คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ม็อกและสปาย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ