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