0Pricing
Swift Academy · Pelajaran

Mocking Berbasis Protokol dan Injeksi Dependensi

Menyuntikkan pengganti pengujian melalui protokol tanpa framework mocking pihak ketiga.

Mocking Berbasis Protokol dan Injeksi Dependensi adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.

Mengapa Mocking Berbasis Protokol?

Menggunakan protokol sebagai celah penggantian memungkinkan implementasi nyata ditukar dengan pengganti pengujian tanpa mengubah kode produksi.

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

Mendefinisikan Protokol

Ekstrak protokol dari dependensi Anda yang hanya berisi metode yang diperlukan kelas Anda.

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

Injeksi melalui Inisialisator

Teruskan dependensi melalui inisialisator agar pengujian dapat memasok mock.

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

Menulis Mock

Implementasikan protokol dengan keadaan yang dapat dikendalikan: catat panggilan dan kembalikan nilai stub.

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 Kembalian Stub

Konfigurasikan stub sebelum pengujian untuk mengendalikan nilai yang dikembalikan mock dan menyimulasikan berbagai skenario.

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

Memverifikasi Interaksi

Setelah menjalankan sistem yang diuji, pastikan mock dipanggil dengan argumen yang diharapkan.

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

Simulasi Kesalahan

Lemparkan kesalahan dari mock untuk menguji jalur penanganan kesalahan dalam kode produksi.

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

Injeksi Properti

Alternatifnya, sediakan dependensi sebagai properti yang dapat diatur agar penggantian dalam pengujian lebih sederhana.

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

Injeksi @Environment / @EnvironmentObject

Aplikasi SwiftUI menginjeksikan dependensi melalui lingkungan, sehingga tampilan dapat diuji dengan memasok objek lingkungan mock.

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

Menghindari Mocking Berlebihan

Mock hanya dependensi langsung; gunakan kolaborator nyata jika perilakunya deterministik dan cepat.

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

Komposisi Protokol untuk Antarmuka yang Lebih Sempit

Gunakan protokol yang lebih kecil dan terfokus (Prinsip Segregasi Antarmuka) agar mock hanya mengimplementasikan hal yang diperlukan.

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

Pemeriksaan Singkat

Apa manfaat utama menginjeksikan dependensi melalui protokol, bukan melalui tipe konkret?

Rangkuman Pelajaran

Definisikan celah protokol untuk setiap dependensi. Lakukan injeksi melalui inisialisator. Implementasikan mock yang mencatat panggilan dan mengembalikan stub. Simulasikan kesalahan dengan mock yang dapat melemparkan kesalahan. Verifikasi interaksi dengan XCTAssertEqual pada array panggilan yang tercatat.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mocking Berbasis Protokol dan Injeksi Dependensi” gratis?

Ya — teks lengkap “Mocking Berbasis Protokol dan Injeksi Dependensi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mocking Berbasis Protokol dan Injeksi Dependensi”?

Menyuntikkan pengganti pengujian melalui protokol tanpa framework mocking pihak ketiga. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Mocking Berbasis Protokol dan Injeksi Dependensi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Penyiapan, Pembongkaran, dan Metode Pengujian XCTestCase
  2. Keluarga XCTAssert dan Pernyataan yang Melempar Error
  3. Mocking Berbasis Protokol dan Injeksi Dependensi
  4. Pengujian Async dan Pengukuran Kinerja
← Kembali ke Swift Academy