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

การจำลองตามโพรโทคอลและการฉีกการพึ่งพา

ฉีดวัตถุจำลองสำหรับการทดสอบผ่านโพรโทคอล โดยไม่ใช้เฟรมเวิร์กจำลองจากภายนอก

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

เหตุใดจึงใช้การจำลองด้วยโพรโทคอล

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

protocol NetworkService {
  func fetch(url: URL) async throws -> Data
}
class RealNetworkService: NetworkService { /* URLSession */ }
class MockNetworkService: NetworkService { /* returns fixtures */ }

การกำหนดโพรโทคอล

แยกโพรโทคอลจากการพึ่งพาของคุณ โดยมีเฉพาะเมธอดที่คลาสของคุณต้องใช้

protocol UserRepository {
  func getUser(id: Int) async throws -> User
  func saveUser(_ user: User) async throws
}

การฉีดผ่านตัวเริ่มต้น

ส่งการพึ่งพาผ่านตัวเริ่มต้น เพื่อให้การทดสอบสามารถส่งวัตถุจำลองเข้าไปได้

class ProfileViewModel {
  private let repo: UserRepository
  init(repo: UserRepository = RealUserRepository()) {
    self.repo = repo
  }
}

การเขียนวัตถุจำลอง

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

class MockUserRepo: UserRepository {
  var fetchedIds: [Int] = []
  var stubbedUser: User = User(id: 1, name: "Test")
  func getUser(id: Int) async throws -> User {
    fetchedIds.append(id)
    return stubbedUser
  }
  func saveUser(_ user: User) async throws {}
}

ค่าที่คืนจากวัตถุจำลอง

กำหนดค่าจำลองก่อนการทดสอบ เพื่อควบคุมสิ่งที่วัตถุจำลองคืนค่าและจำลองสถานการณ์ต่าง ๆ

let mock = MockUserRepo()
mock.stubbedUser = User(id: 42, name: "Alice")
let vm = ProfileViewModel(repo: mock)
await vm.loadProfile(id: 42)
XCTAssertEqual(vm.userName, "Alice")

การตรวจสอบการโต้ตอบ

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

XCTAssertEqual(mock.fetchedIds, [42], "Should fetch user 42 exactly once")

การจำลองข้อผิดพลาด

ให้วัตถุจำลองโยนข้อผิดพลาด เพื่อทดสอบเส้นทางการจัดการข้อผิดพลาดในโค้ดสำหรับใช้งานจริง

class FailingRepo: UserRepository {
  func getUser(id: Int) async throws -> User { throw NetworkError.notFound }
  func saveUser(_ user: User) async throws { throw NetworkError.serverError(500) }
}

การฉีดพร็อพเพอร์ตี

อีกทางเลือกหนึ่งคือเปิดเผยการพึ่งพาเป็นพร็อพเพอร์ตีที่กำหนดค่าได้ เพื่อให้สลับแทนที่ในการทดสอบได้ง่ายขึ้น

class OrderService {
  var paymentGateway: PaymentGateway = StripeGateway()
}
let service = OrderService()
service.paymentGateway = MockPaymentGateway()

การฉีดผ่าน @Environment / @EnvironmentObject

แอป SwiftUI ฉีดการพึ่งพาผ่านสภาพแวดล้อม ทำให้ทดสอบวิวได้โดยจัดเตรียมวัตถุสภาพแวดล้อมจำลอง

let mockStore = MockCartStore()
let view = CartView().environmentObject(mockStore)

การหลีกเลี่ยงการจำลองมากเกินไป

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

// OK to use real DateFormatter in tests — it's deterministic
// Mock URLSession — network I/O is slow and non-deterministic

การประกอบโพรโทคอลเพื่ออินเทอร์เฟซที่แคบลง

ใช้โพรโทคอลขนาดเล็กที่มุ่งเน้นเฉพาะด้าน (หลักการแยกอินเทอร์เฟซ) เพื่อให้วัตถุจำลองนำไปใช้เฉพาะสิ่งที่จำเป็น

protocol Readable { func read() async throws -> [Item] }
protocol Writable { func write(_ item: Item) async throws }
typealias ReadWrite = Readable & Writable

ตรวจสอบอย่างรวดเร็ว

ประโยชน์หลักของการฉีดการพึ่งพาผ่านโพรโทคอลแทนชนิดรูปธรรมคืออะไร

สรุปบทเรียน

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

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

บทเรียน “การจำลองตามโพรโทคอลและการฉีกการพึ่งพา” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การจำลองตามโพรโทคอลและการฉีกการพึ่งพา”

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

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

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

บทเรียน “การจำลองตามโพรโทคอลและการฉีกการพึ่งพา” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การตั้งค่า การล้างข้อมูล และเมธอดการทดสอบของ XCTestCase
  2. กลุ่มคำยืนยัน XCTAssert และคำยืนยันที่โยนข้อผิดพลาด
  3. การจำลองตามโพรโทคอลและการฉีกการพึ่งพา
  4. การทดสอบแบบอะซิงโครนัสและการวัดประสิทธิภาพ
← กลับไปที่ Swift Academy