Swift Academy · Pelajaran

Mocking Berasaskan Protokol dan Suntikan Kebergantungan

Suntik pengganti ujian melalui protokol tanpa rangka kerja mocking pihak ketiga.

Pelajaran 3 daripada 413 langkah

Mocking Berasaskan Protokol dan Suntikan Kebergantungan ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Mengapa Mock Berasaskan Protokol

Penggunaan protokol sebagai titik sambungan membolehkan anda menggantikan pelaksanaan sebenar dengan pengganti ujian tanpa mengubah kod produksi.

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

Menentukan Protokol

Ekstrak protokol daripada kebergantungan anda, yang mengandungi hanya kaedah yang diperlukan oleh kelas anda.

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

Menyuntik melalui Pemula

Hantar kebergantungan melalui pemula supaya ujian boleh membekalkan mock.

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

Menulis mock

Laksanakan protokol dengan keadaan yang boleh dikawal: rekodkan panggilan dan kembalikan nilai tiruan.

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 {}
}

Nilai Pulangan Tiruan

Konfigurasikan nilai tiruan sebelum ujian untuk mengawal perkara yang dikembalikan oleh mock, lalu mensimulasikan senario yang berbeza.

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

Mengesahkan Interaksi

Selepas menjalankan sistem yang diuji, sahkan bahawa mock dipanggil dengan argumen yang dijangka.

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

Simulasi Ralat

Lemparkan ralat daripada mock untuk menguji laluan pengendalian ralat dalam kod produksi.

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

Suntikan Sifat

Sebagai alternatif, dedahkan kebergantungan sebagai sifat yang boleh ditetapkan untuk penggantian yang lebih mudah dalam ujian.

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

Suntikan @Environment / @EnvironmentObject

Aplikasi SwiftUI menyuntik kebergantungan melalui persekitaran, menjadikan paparan boleh diuji dengan membekalkan objek persekitaran mock.

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

Mengelakkan Mock Berlebihan

Gunakan mock hanya untuk kebergantungan langsung; gunakan rakan kerjasama sebenar apabila hasilnya deterministik dan pantas.

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

Gubahan Protokol untuk Antara Muka yang Lebih Sempit

Gunakan protokol yang lebih kecil dan berfokus (Prinsip Pengasingan Antara Muka) supaya mock hanya melaksanakan perkara yang diperlukan.

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

Semakan Pantas

Apakah manfaat utama menyuntik kebergantungan melalui protokol berbanding jenis konkrit?

Ringkasan Pelajaran

Tentukan titik sambungan protokol untuk setiap kebergantungan. Suntik melalui pemula. Laksanakan mock yang merekodkan panggilan dan mengembalikan nilai tiruan. Simulasikan ralat dengan mock yang boleh melempar ralat. Sahkan interaksi menggunakan XCTAssertEqual pada tatasusunan panggilan yang direkodkan.

Percuma untuk bermula

Pelajari Swift dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
122
Pelajaran
409

Soalan Lazim

Adakah pelajaran “Mocking Berasaskan Protokol dan Suntikan Kebergantungan” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Mocking Berasaskan Protokol dan Suntikan Kebergantungan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mocking Berasaskan Protokol dan Suntikan Kebergantungan”?

Suntik pengganti ujian melalui protokol tanpa rangka kerja mocking pihak ketiga. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Mocking Berasaskan Protokol dan Suntikan Kebergantungan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Persediaan, Pembersihan dan Kaedah Ujian XCTestCase
  2. Keluarga XCTAssert dan Penegasan yang Melontarkan Ralat
  3. Mocking Berasaskan Protokol dan Suntikan Kebergantungan
  4. Ujian Async dan Pengukuran Prestasi
← Kembali ke Swift Academy