0Pricing
Lua Academy · บทเรียน

ม็อกและสปาย

แยกโค้ดที่กำลังทดสอบออกมา

ม็อกและสปาย เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุใดจึงต้องทดสอบ
  2. บล็อก describe และ it
  3. การยืนยัน
  4. ม็อกและสปาย
← กลับไปที่ Lua Academy