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

การจำลองการพึ่งพาในการทดสอบ

สลับการใช้งานจริงเป็นตัวแทนสำหรับการทดสอบ

การจำลองการพึ่งพาในการทดสอบ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

การจำลองสิ่งพึ่งพาในการทดสอบ

ตัวจำลองคือการนำสิ่งพึ่งพามาใช้แบบปลอมในการทดสอบ เนื่องจากเราฉีดโปรโตคอลได้ เราจึงส่งตัวจำลองมาแทนสิ่งที่ทำงานร่วมกันจริง

โปรโตคอลสำหรับจำลอง

เริ่มจากโปรโตคอลที่อธิบายสิ่งพึ่งพา ชนิดจริงและตัวจำลองต่างก็สอดคล้องกับโปรโตคอลนี้

protocol UserStore {
    func name(for id: Int) -> String
}
struct RealStore: UserStore {
    func name(for id: Int) -> String { "User-\(id)" }
}
print(RealStore().name(for: 5))

เขียนตัวจำลอง

ตัวจำลองสอดคล้องกับโปรโตคอล แต่คืนค่าที่กำหนดไว้ล่วงหน้า จึงหลีกเลี่ยงการเข้าถึงเครือข่ายหรือดิสก์จริง

protocol UserStore { func name(for id: Int) -> String }
struct MockStore: UserStore {
    func name(for id: Int) -> String { "Mock" }
}
print(MockStore().name(for: 99))

ฉีดตัวจำลอง

ส่งตัวจำลองให้ระบบที่กำลังทดสอบผ่านตัวเริ่มต้น โค้ดที่กำลังทดสอบจะไม่สามารถแยกความแตกต่างได้

protocol UserStore { func name(for id: Int) -> String }
struct MockStore: UserStore { func name(for id: Int) -> String { "Mock" } }
struct Profile {
    let store: UserStore
    func title(_ id: Int) -> String { "Hello, " + store.name(for: id) }
}
print(Profile(store: MockStore()).title(1))

บันทึกการเรียกใช้

ตัวจำลองสามารถบันทึกวิธีที่ถูกเรียกใช้ ทำให้การทดสอบตรวจยืนยันได้ว่าสิ่งพึ่งพาถูกเรียกอย่างถูกต้อง

protocol Analytics { func track(_ e: String) }
class SpyAnalytics: Analytics {
    var events: [String] = []
    func track(_ e: String) { events.append(e) }
}
let spy = SpyAnalytics()
spy.track("open")
spy.track("buy")
print(spy.events)

ตรวจยืนยันพฤติกรรม

หลังจากเรียกใช้โค้ดแล้ว ให้ตรวจสอบข้อมูลที่บันทึกไว้ ในที่นี้เราตรวจยืนยันว่าเหตุการณ์ที่ถูกต้องเกิดขึ้น

protocol Analytics { func track(_ e: String) }
class Spy: Analytics { var last = ""; func track(_ e: String) { last = e } }
struct Checkout { let analytics: Analytics; func pay() { analytics.track("paid") } }
let spy = Spy()
Checkout(analytics: spy).pay()
print(spy.last == "paid")

จำลองค่าที่คืนกลับ

ตัวจำลองจะคืนค่าที่กำหนดไว้ล่วงหน้า เพื่อให้คุณทดสอบว่าโค้ดตอบสนองต่อข้อมูลนำเข้าที่เฉพาะเจาะจงอย่างไร

protocol Clock { func hour() -> Int }
struct StubClock: Clock { let value: Int; func hour() -> Int { value } }
struct Greeter { let clock: Clock; func greet() -> String { clock.hour() < 12 ? "AM" : "PM" } }
print(Greeter(clock: StubClock(value: 9)).greet())
print(Greeter(clock: StubClock(value: 18)).greet())

จำลองความล้มเหลว

ตัวจำลองสามารถจำลองเงื่อนไขข้อผิดพลาดที่กระตุ้นได้ยากด้วยสิ่งพึ่งพาจริง ช่วยเพิ่มความครอบคลุมของการทดสอบ

protocol Loader { func load() -> Int? }
struct FailingLoader: Loader { func load() -> Int? { nil } }
struct VM { let loader: Loader; func status() -> String { loader.load() == nil ? "error" : "ok" } }
print(VM(loader: FailingLoader()).status())

การทดสอบที่ให้ผลแน่นอน

เนื่องจากตัวจำลองคืนค่าที่กำหนดตายตัว การทดสอบจึงรวดเร็วและให้ผลแน่นอน โดยไม่เกิดความไม่แน่นอนจากบริการจริง

protocol Random { func next() -> Int }
struct FixedRandom: Random { func next() -> Int { 42 } }
struct Game { let rng: Random; func roll() -> Int { rng.next() } }
print(Game(rng: FixedRandom()).roll())

ยังไม่ใช้เฟรมเวิร์กการทดสอบ

ในโครงการจริง การตรวจสอบเหล่านี้จะอยู่ในคำสั่งตรวจยืนยันของ XCTest รูปแบบการฉีดยังคงเหมือนเดิม มีเพียงไวยากรณ์การตรวจยืนยันที่แตกต่างกัน

protocol Calc { func add(_ a: Int, _ b: Int) -> Int }
struct RealCalc: Calc { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct MockCalc: Calc { func add(_ a: Int, _ b: Int) -> Int { 0 } }
print(RealCalc().add(2, 2))
print(MockCalc().add(2, 2))

วงจรทั้งหมด

กำหนดโปรโตคอล เขียนชนิดที่สอดคล้องกันทั้งแบบจริงและแบบจำลอง ฉีดตัวจำลอง เรียกใช้โค้ด และตรวจยืนยัน DI ทำให้ทุกขั้นตอนเหล่านี้เป็นไปได้

protocol Repo { func count() -> Int }
struct MockRepo: Repo { func count() -> Int { 3 } }
struct Stats { let repo: Repo; func total() -> Int { repo.count() * 2 } }
print(Stats(repo: MockRepo()).total())

ตรวจสอบความเข้าใจ

อะไรทำให้การจำลองสิ่งพึ่งพาเป็นไปได้ในแนวทางนี้

สรุปทบทวน

ตัวจำลองสอดคล้องกับโปรโตคอลที่ฉีดเข้ามา และคืนค่าที่กำหนดไว้ล่วงหน้า บันทึกการเรียกใช้ หรือจำลองความล้มเหลวได้ การฉีดตัวจำลองทำให้เกิดการทดสอบที่รวดเร็วและให้ผลแน่นอน วงจรคือ กำหนดโปรโตคอล เขียนชนิดที่สอดคล้องกันทั้งแบบจริงและแบบจำลอง ฉีด เรียกใช้ และตรวจยืนยัน บทเรียน DI จบลงเพียงเท่านี้

คำถามที่พบบ่อย

บทเรียน “การจำลองการพึ่งพาในการทดสอบ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจำลองการพึ่งพาในการทดสอบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจำลองการพึ่งพาในการทดสอบ”

สลับการใช้งานจริงเป็นตัวแทนสำหรับการทดสอบ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การจำลองการพึ่งพาในการทดสอบ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุผลที่ใช้การฉีดการพึ่งพา
  2. การฉีดผ่านตัวสร้าง
  3. นามธรรมที่อิงตามโพรโทคอล
  4. การจำลองการพึ่งพาในการทดสอบ
← กลับไปที่ Swift Academy