Swift Academy · Leçon

Simuler les dépendances dans les tests

Remplacez les implémentations réelles par des doublures de test.

Leçon 4 sur 413 étapes

Simuler les dépendances dans les tests est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.

Simuler les dépendances dans les tests

Un simulacre est une implémentation factice d’une dépendance utilisée dans les tests. Comme nous injectons des protocoles, nous pouvons fournir un simulacre à la place du collaborateur réel.

Un protocole à simuler

Commencez par un protocole qui décrit la dépendance. Le type réel et le simulacre s’y conforment tous les deux.

protocol UserStore {
    func name(for id: Int) -> String
}
struct RealStore: UserStore {
    func name(for id: Int) -> String { "User-\(id)" }
}
print(RealStore().name(for: 5))

Écrire un simulacre

Un simulacre se conforme au protocole, mais renvoie des valeurs prédéfinies, ce qui évite tout accès réel au réseau ou au disque.

protocol UserStore { func name(for id: Int) -> String }
struct MockStore: UserStore {
    func name(for id: Int) -> String { "Mock" }
}
print(MockStore().name(for: 99))

Injecter le simulacre

Transmettez le simulacre au système testé par l’intermédiaire de son initialiseur. Le code testé ne peut pas faire la différence.

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))

Enregistrer les appels

Un simulacre peut enregistrer la manière dont il a été utilisé afin qu’un test puisse vérifier que la dépendance a été appelée correctement.

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)

Vérifier le comportement

Après avoir exécuté le code, vérifiez les données enregistrées. Ici, nous vérifions que le bon événement a été déclenché.

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")

Simuler les valeurs de retour

Un bouchon renvoie des valeurs prédéfinies afin que vous puissiez tester la réaction de votre code à des entrées précises.

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())

Simuler un échec

Les simulacres peuvent reproduire des situations d’erreur difficiles à déclencher avec de vraies dépendances, ce qui améliore la couverture des tests.

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())

Tests déterministes

Comme les simulacres renvoient des valeurs fixes, les tests sont rapides et déterministes, sans instabilité due aux services réels.

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())

Aucun cadre de test ici

Dans un véritable projet, ces vérifications se trouvent dans des assertions XCTest. Le modèle d’injection est identique ; seule la syntaxe des vérifications diffère.

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))

Le cycle complet

Définissez le protocole, écrivez les types conformes réel et simulé, injectez le simulacre, exécutez le code et vérifiez le résultat. La DI rend chaque étape possible.

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())

Vérification rapide

Qu’est-ce qui rend possible la simulation d’une dépendance dans cette approche ?

Récapitulatif

Un simulacre se conforme au protocole injecté et renvoie des valeurs prédéfinies, enregistre les appels ou simule des échecs. L’injecter produit des tests rapides et déterministes. Le cycle est le suivant : définir le protocole, écrire les types conformes réel et simulé, injecter, exécuter le code et vérifier le résultat. Le cours sur la DI est maintenant terminé.

Gratuit pour commencer

Apprends Swift avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
122
Leçons
409

Questions Fréquemment Posées

La leçon « Simuler les dépendances dans les tests » est-elle gratuite ?

Oui — le texte complet de « Simuler les dépendances dans les tests » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Simuler les dépendances dans les tests » ?

Remplacez les implémentations réelles par des doublures de test. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Swift Academy ?

Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Simuler les dépendances dans les tests » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?

Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pourquoi l’injection de dépendances
  2. Injection par constructeur
  3. Abstractions fondées sur les protocoles
  4. Simuler les dépendances dans les tests
← Retour à Swift Academy