การจำลองการพึ่งพาในการทดสอบ
สลับการใช้งานจริงเป็นตัวแทนสำหรับการทดสอบ
การจำลองการพึ่งพาในการทดสอบ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุผลที่ใช้การฉีดการพึ่งพา
- การฉีดผ่านตัวสร้าง
- นามธรรมที่อิงตามโพรโทคอล
- การจำลองการพึ่งพาในการทดสอบ