0Pricing
Swift Academy · Lección

Mocking basado en protocolos e inyección de dependencias

Inyecte dobles de prueba mediante protocolos sin frameworks de mocking de terceros.

Mocking basado en protocolos e inyección de dependencias es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

¿Por qué usar mocks basados en protocolos?

El uso de protocolos como puntos de sustitución permite cambiar implementaciones reales por dobles de prueba sin modificar el código de producción.

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

Definición del protocolo

Extraiga un protocolo de su dependencia que contenga únicamente los métodos que necesita su clase.

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

Inyección mediante el inicializador

Pase la dependencia mediante el inicializador para que las pruebas puedan proporcionar un mock.

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

Escritura de un mock

Implemente el protocolo con un estado controlable: registre las llamadas y devuelva valores 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 {}
}

Valores de retorno stub

Configure los stubs antes de la prueba para controlar lo que devuelve el mock y simular distintos escenarios.

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

Verificación de interacciones

Después de ejecutar el sistema sometido a prueba, compruebe que el mock recibió los argumentos esperados.

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

Simulación de errores

Lance errores desde el mock para probar las rutas de gestión de errores del código de producción.

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

Inyección mediante propiedades

Como alternativa, exponga la dependencia como una propiedad configurable para facilitar su sustitución en las pruebas.

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

Inyección con @Environment / @EnvironmentObject

Las aplicaciones SwiftUI inyectan dependencias mediante el entorno, lo que permite probar las vistas proporcionando objetos de entorno simulados.

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

Cómo evitar el exceso de mocking

Simule únicamente las dependencias directas; use colaboradores reales cuando sean deterministas y rápidos.

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

Composición de protocolos para interfaces más específicas

Use protocolos más pequeños y específicos (principio de segregación de interfaces) para que los mocks solo implementen lo necesario.

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

Comprobación rápida

¿Cuál es la principal ventaja de inyectar dependencias mediante un protocolo en lugar de un tipo concreto?

Resumen de la lección

Defina un punto de sustitución mediante un protocolo para cada dependencia. Inyecte las dependencias mediante el inicializador. Implemente mocks que registren las llamadas y devuelvan stubs. Simule errores con mocks que puedan lanzar errores. Verifique las interacciones con XCTAssertEqual sobre los arrays de llamadas registradas.

Preguntas frecuentes

¿La lección «Mocking basado en protocolos e inyección de dependencias» es gratis?

Sí — el texto completo de «Mocking basado en protocolos e inyección de dependencias» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Mocking basado en protocolos e inyección de dependencias»?

Inyecte dobles de prueba mediante protocolos sin frameworks de mocking de terceros. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Mocking basado en protocolos e inyección de dependencias»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Configuración, desmontaje y métodos de prueba de XCTestCase
  2. Familia XCTAssert y aserciones que lanzan errores
  3. Mocking basado en protocolos e inyección de dependencias
  4. Pruebas asíncronas y medición del rendimiento
← Volver a Swift Academy